Ошибка вызова функции-члена getClientOriginalExtension () на null в laravel 5.3?

Я использую вмешательство для функции загрузки изображений, но когда я пытаюсь загрузить изображение от почтальона с помощью «content-type: multipart / form-data» в заголовке, оно появляется выше ошибки, но если я удалю заголовок content-type, тогда это будет работает нормально. Я добавил изображения почтальона. Заголовок почтальона с запросом  ** Загрузка изображения почтальона **

мой маршрут

Route :: post ('контакт / изображение / загрузка', ['as' => 'interval.postresizeimage', 'uses' => 'contactController @ upload_image']);

код в контроллере

public function upload_image(Request $request){

      if((preg_match("/^[789]\d{9}$/", $request->header('UID')))){

        $photo = $request->file('image');
        $imagename = time().'.'.$photo->getClientOriginalExtension(); 

        $destinationPath_thumb = storage_path('images/thumbnail_images');
        $thumb_img = Image::make($photo->getRealPath())->resize(100, 100);
        $thumb_img->save($destinationPath_thumb.'/'.$imagename,80);

        $destinationPath_medium = storage_path('images/medium_images');
        $medium_img = Image::make($photo->getRealPath())->resize(500, 500);
        $medium_img->save($destinationPath_medium.'/'.$imagename,80);

        $destinationPath_original = storage_path('images/original_images');
        $photo->move($destinationPath_original, $imagename);

        $user = \App\User::select(['inst_id'])->where('mobile','=',$request->header('UID'))->first();

        $update_img = \App\Contact::where([['id','=',$request->ID],['inst_id','=',$user->inst_id]])->update(['image'=>$imagename]);

        if($update_img)
          $response = response()->json(['data'=>[], 'error'=>0,  'error_msg'=>'', 'message'=>'Profile updated']);
        else
          $response = response()->json(['data'=>[], 'error'=>1,  'error_msg'=>'some went wrong', 'message'=>'Please try again']);
      }
      else
         $response = response()->json(['data'=>[], 'error'=>1,  'error_msg'=>'wrong mobile in UID header','message'=>'wrong mobile no. in header']);

    return  $response;

  }

person SaMeEr    schedule 02.02.2017    source источник
comment
Ваше фото не загружено. попробуйте использовать эту $ photo [0] вместо фото   -  person Vikash    schedule 02.02.2017
comment
Где мне это изменить?   -  person SaMeEr    schedule 02.02.2017
comment
Попробуйте напечатать переменную $ photo и проверьте значение. Также проверьте свою форму, она должна быть enctype = multipart / form-data.   -  person shafiq.rst    schedule 02.02.2017
comment
@shafiq Я использую laravel в качестве API, как мне проверить этот enctype?   -  person SaMeEr    schedule 02.02.2017
comment
Я попытался напечатать $ photo с помощью dd ($ photo), поэтому в ответ получил пустой массив.   -  person SaMeEr    schedule 02.02.2017
comment
@SaMeEr $ photo должен дать вам объект Illuminate \ Http \ UploadedFile. Это означает, что файл не загружается. Проверьте свой тип контента. stackoverflow.com/questions/16015548/   -  person shafiq.rst    schedule 02.02.2017
comment
@SaMeEr Я думаю, вы включаете тип содержимого в свой запрос. stackoverflow.com/questions/16015548/   -  person shafiq.rst    schedule 02.02.2017
comment
@shafiq. да. но я думаю, что его следует добавить туда, потому что устройства android и ios запрашивают этот заголовок, который не работает.   -  person SaMeEr    schedule 02.02.2017
comment
@SaMeEr Android и ios должны отправлять запрос с типом содержимого: multipart / form-data, однако в почтальоне вы не добавляете его, поскольку почтальон уже включает его. Для android и iso он будет работать, только если установлен content-type: multipart / form-data   -  person shafiq.rst    schedule 02.02.2017


Ответы (1)


Файл отсутствует во вводе, поэтому он становится нулевым, поэтому рекомендуется проверить, есть ли файл в запросе ввода, и продолжить, иначе вернуть ошибку.

А также в вашей HTML форме добавьте это

<form enctype="multipart/form-data">

или если вы используете коллектив laravel, добавьте 'files'=> true в форму

и я обновил ваш код, чтобы проверить, присутствует ли файл ниже

public function upload_image(Request $request){

  if((preg_match("/^[789]\d{9}$/", $request->header('UID')))){

    if(!$request->hasFile('image')) {

      return response()->json(['data'=>[], 'error'=>1,  'error_msg'=>'image file is required', 'message'=>'image file is required for upload']);
    }

    $photo = $request->file('image');
    $imagename = time().'.'.$photo->getClientOriginalExtension(); 

    $destinationPath_thumb = storage_path('images/thumbnail_images');
    $thumb_img = Image::make($photo->getRealPath())->resize(100, 100);
    $thumb_img->save($destinationPath_thumb.'/'.$imagename,80);

    $destinationPath_medium = storage_path('images/medium_images');
    $medium_img = Image::make($photo->getRealPath())->resize(500, 500);
    $medium_img->save($destinationPath_medium.'/'.$imagename,80);

    $destinationPath_original = storage_path('images/original_images');
    $photo->move($destinationPath_original, $imagename);

    $user = \App\User::select(['inst_id'])->where('mobile','=',$request->header('UID'))->first();

    $update_img = \App\Contact::where([['id','=',$request->ID],['inst_id','=',$user->inst_id]])->update(['image'=>$imagename]);

    if($update_img)
      $response = response()->json(['data'=>[], 'error'=>0,  'error_msg'=>'', 'message'=>'Profile updated']);
    else
      $response = response()->json(['data'=>[], 'error'=>1,  'error_msg'=>'some went wrong', 'message'=>'Please try again']);
  }
  else
     $response = response()->json(['data'=>[], 'error'=>1,  'error_msg'=>'wrong mobile in UID header','message'=>'wrong mobile no. in header']);

return  $response;

}

person msonowal    schedule 02.02.2017
comment
Хорошо. но как насчет устройств android и ios, которые запрашивают мой api и пытаются загрузить файл. как они меняют формат запроса? - person SaMeEr; 02.02.2017
comment
Потому что они всегда устанавливают RequestHeader с типом содержимого: multipart / form-data. - person SaMeEr; 02.02.2017
comment
Собственно проблема не в этом. Я добавляю заголовок типа содержимого в почтальоне, поэтому он не работает, но если я удалю этот заголовок типа содержимого, он будет работать нормально. Но я предполагаю, что такие устройства, как android и ios, отправляют запрос с типом содержимого: multipart / form-data, поэтому я должен добавить это в почтальоне. вот почему я запутался. - person SaMeEr; 02.02.2017