Laravel上传多个文件

时间:2019-05-13 08:25:27

标签: laravel controller upload

我正在建立具有多个文件功能的画廊。

到目前为止,我遇到了两个问题,但让我们先粘贴我的代码。

控制器:

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!');
}

查看刀片:

    <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

如何将这些多张图像上传到“存储”文件夹并将它们全部记录到数据库中?

-编辑- 我已经解决了我的第一个问题!

我只是将save方法和其他细节放入循环中。我之前应该已经考虑过这一点:)

这是我更新的代码:

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 :(得分:0)

尝试使用以下代码实施,它将以序列化格式提供上传文件的网址

    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;
        }
    }

答案 1 :(得分:0)

我终于解决了问题并将其发布,因此对某些人可能有用。

这是我的代码:

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!');
}

答案 2 :(得分:0)

///我已经更新并评论了您的代码。试试吧,它应该起作用。

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!');
    }