Laravel загрузить несколько файлов - PullRequest
0 голосов
/ 13 мая 2019

Я строю галерею с несколькими файлами.

Пока у меня две проблемы, но давайте сначала вставим мой код.

Контроллер:

public function store(Request $request)
{

  $gallery = new GalleryImage();

  if($request->hasFile('image')) {
    $images = $request->file('image');
    foreach($images as $image) {
      $path = $image->getClientOriginalName();
      $name = time() . '-' . $path;
      $gallery->image = $image->move(public_path().'/uploads/temp/', $name);
      //$gallery->image = $request->file('image')->storeAs('public/gallery-images', $name);
    }
  }

  $gallery->gallery_id = $request->gallery_id;

  $gallery->save();

  return back()->with('success_message','Images has been uploaded!');
}

View blade:

    <form action="{{ route('gallery-images.store') }}" method="POST" enctype="multipart/form-data">
      {{ csrf_field() }}
      <div class="form-group">
        <input type="hidden" name="gallery_id" value="{{ $gallery->id }}">
        <input type="file" name="image[]" id="id_imageGallery" class="form-control" multiple="multiple" required>
      </div>
      <div class="form-group">
        <button type="submit" class="btn btn-primary">Upload</button>
      </div>
    </form>

Моя первая проблема, когда у меня есть такой код и я загружаю три файла, он успешно сохраняет файлы в каталоге / uploads / temp, но в моей базе данных я вижу, что естьзагружено только одно изображение вместо трех.

Моя вторая проблема - когда я изменяю свой код и использую закомментированную часть (потому что я хочу сохранить эти три изображения в хранилище):

$gallery->image = $request->file('image')->storeAs('public/gallery-images', $name);

Я получаю эту ошибку:

Call to a member function storeAs() on array

Как я могу загрузить эти несколько изображений в папку Storage и записать их все в базу данных?

- EDIT - ярешил мою первую проблему!

Я просто поместил метод сохранения и другие детали в цикл.Я должен был подумать об этом раньше:)

Вот мой обновленный код:

public function store(Request $request)
{


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

    $images = $request->file('image');
    foreach($images as $image) {
      $gallery = new GalleryImage();
      $path = $image->getClientOriginalName();
      $name = time() . '-' . $path;
      $gallery->image = $image->move(public_path().'/uploads/temp/', $name);
      //$gallery->image = $request->file('image')->storeAs('public/gallery-images', $name);

      $gallery->gallery_id = $request->gallery_id;
      $gallery->save();
    }
  }


  return back()->with('success_message','Images has been uploaded!');
}

Теперь единственное, что нужно сделать, это как сохранить их в хранилище файлов вместо public_path иизбежать этой ошибки:

Call to a member function storeAs() on array 

Ответы [ 3 ]

0 голосов
/ 13 мая 2019

Я наконец-то решил проблемы и выкладываю, так что это может быть полезно для некоторых.

Вот мой код:

public function store(Request $request)
{

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

    foreach($request->image as $image) {
      $path = $image->getClientOriginalName();
      $name = time() . '-' . $path;

      $gallery = new GalleryImage();
      $gallery->image = $image->storeAs('public/gallery-images', $name);
      $gallery->gallery_id = $request->gallery_id;
      $gallery->save();
    }
  }

  return back()->with('success_message','The images have been uploaded!');
}
0 голосов
/ 13 мая 2019

// Я обновил и прокомментировал ваш код. Попробуйте, это должно работать.

public function store(Request $request)
    {
      if($request->hasFile('image')) {

        $images = $request->file('image');
        foreach($images as $image) {
          $gallery = new GalleryImage();
          // laravel auto manages unique name and extension of file.
          $gallery->image = $image->store('gallery-images', 'public'); 
          $gallery->gallery_id = $request->gallery_id;
          $gallery->save();
        }
      }
      return back()->with('success_message','Images has been uploaded!');
    }
0 голосов
/ 13 мая 2019

Попробуйте реализовать с помощью следующего кода, он выдаст URL загруженных файлов в сериализованном формате

    public static function upload_file($file){
        $file_name = time();
        $file_name .= rand();
        $file_name = sha1($file_name);
        if ($file) {
            $ext = $file->getClientOriginalExtension();
            $file->move(public_path() . "/uploads", $file_name . "." . $ext);
            $local_url = $file_name . "." . $ext;
            $s3_url = url('/').'/uploads/'.$local_url;
            return $s3_url;
        }
        return "";
    }

    public static function upload_multiple_files($files){
        if(is_array($files)){
            $return_array = array();
            foreach ($files as $file){
                if(!empty($file)){
                    $return_array[] = self::upload_file($file);
                }else{
                    $return_array[] = '';
                }
            }
            return serialize($return_array);
        }else{
            return NULL;
        }
    }
...