2012-06-21 2 views
4

У меня есть поле для загрузки файла (attachment1) в форме, которая может иметь или не иметь файл, загруженный в него, когда я обрабатываю форму в laravel.Избегайте исключений при загрузке файлов в laravel

Когда я пытаюсь обработать страницу, эта строка генерирует исключение:

Input::upload('attachment1',path('storage').'attachments/'.$name); 

Вот текст, за исключением:

Message: 
Call to a member function move() on a non-object 

кажется, что мне нужно проверить в заранее, чтобы узнать, есть ли у 'attachment1' файл, и я обнаружил, что функция Input::has_file('attachment1') должна сказать мне, есть ли у 'attachment1' файл, но даже когда я отправляю пустую форму, он возвращает true.

Кроме того, из чтения документации кажется, что Input::upload должен просто вернуть значение false при попытке загрузить несуществующий файл, поэтому почему он создает это исключение и как его исправить?

ответ

3

PHP $_FILES будет содержать ключ tmp_name, независимо от того, загружен ли файл или нет. Он отправляется как пустая строка, но не NULL. Оказывается has_file() ожидает NULL:

public static function has_file($key) 
{ 
    return ! is_null(static::file("{$key}.tmp_name")); 
} 

Чтобы обойти это в вашем контроллере вы можете попробовать:

if (array_get(Input::file('attachment1'), 'tmp_name')) 
{ 
    // file uploaded 
} 
0

При попытке выяснить, как Laravel работает с uplaod и файлами, я узнал некоторые моменты. Я надеюсь, что они будут полезны для вас

Первое:

«Сообщение: Вызов функции члена двигаться() на не-объект»

Это исключение может быть брошено, потому что ваш папка может не иметь разрешений на запись.

Второе:

Вы можете подтвердить ввод в правилах валидации как

'вложение' => «изображение | мим: JPG, GIF, PNG | макс: (в килобайтах)

В-третьих:

Я использую bootstrap, расширенный в моем проекте. Они предпочитают не использовать «имя» attr. с

<input type="file" /> 

Вы можете проверить его из этого link Пожалуйста, перейдите в раздел настроек и прочитать описание столбца имени. Таким образом, я понял в основном, Laravel возвращает true, даже если ввод пуст, потому что фактически он является частью сообщения

В-четвертых: Я хотел бы поделиться своим кодом и принять любые рекомендации. Надеюсь, они все помогут ...

try 
    { 

     $comp = new Company(); 
     $comp->name = newCompanyForm::get('name'); 
     $comp->save(); 
     if($comp) 
     { 
       if(newCompanyForm::has('logo')) 
       { 

        $logo = Input::upload('logo', path('public').'company_logos'); 
        if($logo) 
        { 

         $comp->logo = URL::base().'lms/company_logos/'.$logo->getfileName(); 
         $comp->save(); 
        } 
        else 
         throw new \Exception("Logo yüklenirken hata oluştu. Şirket logosuz kayıt edildi."); 
       } 
       Session::flash('status_success', 'Şirket eklendi.'); 
       newCompanyForm::forget_input(); 
       return Redirect::back(); 
     } 
     else 
      throw new Exception("Şirket eklenirken hata oluştu. Şirket eklenmedi."); 

    } 
    catch(\Exception $e) 
    { 
     $errors->add('lms', $e->getMessage()); 
     return Redirect::back()->with_errors($errors); 
    } 
4

Прежде чем пытаться загрузить приложение, попробуйте выполнить некоторые проверки. Это работает для меня:

$file = Input::file('attachment1'); 
if (is_array($file) && isset($file['error']) && $file['error'] == 0) { 
Input::upload('attachment1',path('storage').'attachments/'.$name); 
} 
0

Самый простой способ «Laravel», чтобы сделать это было бы проверить для ввода имени.

if (Input::has('attachment1')) 
{ 
    // Do stuff 
} 
Смежные вопросы