【问题标题】:Laravel upload multiple filesLaravel 上传多个文件
【发布时间】:2019-09-30 04:19:47
【问题描述】:

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

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

控制器:

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

如何将多张图片上传到 Storage 文件夹并全部记录到数据库中?

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

我只是将保存方法和其他细节放在循环中。我之前应该考虑过这个:)

这是我更新的代码:

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 

【问题讨论】:

    标签: laravel controller upload


    【解决方案1】:

    尝试使用以下代码实现,它会以序列化格式给出上传文件的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;
            }
        }
    

    【讨论】:

    • 太复杂,与问题无关。
    • 我自己也想出了如何将多个文件存储到数据库中。唯一要做的就是如何将它们存储到文件存储中,而不是 public_path。检查我更新的主线程。
    【解决方案2】:

    //我已经更新并评论了你的代码。试试看,应该可以的。

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

    【讨论】:

    • 请检查我的回答。我已经解决了这个问题。顺便说一句,我刚刚检查了你的解决方案,它有错误。 store('gallery-images', 'public'); 您没有在此处传递变量,并且将图像上传到用户友好的文件中非常重要,而不是编码
    • 我的代码没有错误。您需要传递的只是文件夹名称和存储功能的范围。 laravel.com/docs/5.8/filesystem#file-visibility你可以参考这个链接。并祝贺您自行解决。快乐编码!
    • 感谢您澄清这一点。也祝你编码愉快! :)
    【解决方案3】:

    我终于解决了这些问题,我正在发布它,所以它可能对某些人有用。

    这是我的代码:

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

    【讨论】:

      猜你喜欢
      • 2015-01-30
      • 2020-08-04
      • 1970-01-01
      • 2015-09-30
      • 2021-05-13
      • 2021-05-25
      • 2013-08-14
      • 2018-07-16
      • 2013-08-13
      相关资源
      最近更新 更多