Laravel 5.5 - 多张图片上传

Laravel 5.5 - multiple images upload

我的控制器中有这个功能:

use File;
use Image; //image intervention library
...
public function upload(Request $request)
    {
        //make sure there is a folder in public with the username
        $username = Auth::user()->name;
        $folderpath = public_path('images/' . $username . '/');
        File::makeDirectory($folderpath, $mode = 0777, true, true);

        $files = $request->file;

        if(!empty($files)):
            foreach($files as $file):
                $filename = 'post_' . time() . '.' . $file->getClientOriginalExtension();
                $path = $folderpath . $filename;
                Image::make($file)->resize(800,400)->save($path);
            endforeach;
        endif;

        return 'success';
    }

如果我上传多张图片,只保存最后一张图片。

我试过了:

public function upload(Request $request)
    {
        //make sure there is a folder in public with the username
        $username = Auth::user()->name;
        $folderpath = public_path('images/' . $username . '/');
        File::makeDirectory($folderpath, $mode = 0777, true, true);

        $files = $request->file;

        if(!empty($files)):
            foreach($files as $file):
                $filename = 'post_' . time() . '.' . $file->getClientOriginalExtension();
                $path = $folderpath . $filename;
                $file->save($path);
            endforeach;
        endif;

        return ''success;
    }

这让我出错:

Method save does not exist.

我目瞪口呆,好像我没有用模型实例化它。但是这种情况下,如果只是直接文件上传,如何用model实例化呢?

laravel 中上传多张图片的最佳方式是什么?

更新

阅读@kunal 的回答后,我设法通过为文件名添加唯一编号来解决问题:

public function upload(Request $request)
    {
        //make sure there is a folder in public with the username
        $username = Auth::user()->name;
        $folderpath = public_path('images/' . $username . '/');
        File::makeDirectory($folderpath, $mode = 0777, true, true);

        $files = $request->file;
        $count = 0;//<-- add a counter
        if(!empty($files)):
            foreach($files as $file):
                $filename = 'post_' . time() . '_' . $count . '.' . $file->getClientOriginalExtension();//<-- add counter to the file name
                $path = $folderpath . $filename;
                Image::make($file)->resize(800,400)->save($path);
                $count ++;//<-- increase the value
            endforeach;
        endif;

        return 'success';
    }

我想你可能错过了这部分

<input type="file" id="gallery" name="file[]" />

注意 file[] 必须是数组否则会 only save the last image if upload multiple image

如果你的 html 部分是正确的,那么就这样使用,

foreach ($file as $photo) {
    $path = Storage::putFile('foldername', $photo);
}

试试这个代码:

$files= Input::file('image');
$destinationPath= 'images';
$images=array(); 
foreach($files as $file){
    $fullname= $file->getClientOriginalName(); 
    $hashname  = $fullname; 
    $upload_success   =$file->move($destinationPath, $hashname);
    $images[]=$fullname;
    $has= implode(",",$images);
}
$modelname= new Modelname;
$modelname->image_attachment    =  $has;  
$modelname->save();

你 html 页面:

<input type="file" id="image" name="image[]" />

可能您正在寻找这种东西:-

if ($request->hasFile('files')) {
$files = $request->file('files');
foreach($files as $file){
    $extension = $file->getClientOriginalExtension();
    $fileName = str_random(5)."-".date('his')."-".str_random(3).".".$extension;
    $folderpath  = 'images'.'/';
    $file->move($folderpath , $fileName);
}
}
<input type="file" id="gallery" name="files[]" multiple />

没那么复杂。 从 larval 5.8 开始,你可以这样做:

collect($request->images)->each(function ($image) {
    return $image->store('images', 'public');
});

它将图像放在 public 磁盘的图像文件夹中。