有时候我们要使用storage存储文件,但官方只提供了以有限的文档,让我们只好一个个猜测。
自动文件流
如果你想要Laravel自动将给定文件流输出到对应存储路径,可以使用putFile或putFileAs方法,该方法接收Illuminate\Http\File或Illuminate\Http\UploadedFile实例,然后自动将文件流保存到期望的路径:
use Illuminate\Http\File;
// Automatically calculate MD5 hash for file name...
Storage::putFile('photos', new File('/path/to/photo'));
// Manually specify a file name...
Storage::putFileAs('photos', new File('/path/to/photo'), 'photo.jpg');//其中photos为上传图片要存储的位置,/path/to/photo为要上传的文件,photo.jpg为指定的文件名
这里有一些关于putFile方法的重要注意点,注意到我们只指定了目录名,默认情况下,putFile方法会基于文件内容自动生成文件名。实现原理是对文件内容进行MD5哈希运算。putFile方法会返回文件路径,包括文件名,以便于在数据库中进行存储。
putFile和putFileAs方法还接收一个用于指定存储文件“能见度”的参数,这在你将文件存储到云存储(如S3)平台并期望文件可以被公开访问时很有用。
其中photos为上传图片要存储的位置,/path/to/photo为要上传的文件,photo.jpg为指定的文件名。
我使用的实例如下:
$folderName = 'public/upload/images/' //上传后存储路径为/storage/app/public/upload/images/,注意,public/必须添加,不然会报错,上传路径设置了软件连接,会自动软链接至storage/app/public,如果因为storage目录是无法直接访问的,public不存在,会导致错误。
$extension = $this->file->getClientOriginalExtension() ?: 'png';
// 设置保存的文件名
$filename = $filename ? :date("YmdHis", time()).'_'.str_random(2);
$safeName = $filename . '.' . $extension;
Storage::putFileAs($folderName, new File($this->file), $safeName);
最后贴上此段完整代码
$year_mouth = date("Ym", time());
$folderName = ($type == 'avatar')
? 'public/upload/avatars'
: 'public/upload/images/' . $year_mouth . '/' . date("d", time()) . '/' . Auth::user()->id;
// 注:上面的配置必须加public,才能被前台直接访问,文件存储在Storage/app/public下
// 设置存储路径,注:Storage::disk()里的参数是local(默认是Storage/app),public(public目录),或者其他云存储等
//$destinationPath = Storage::disk('local')->getDriver()->getAdapter()->getPathPrefix() . '/' . $folderName;
$extension = $this->file->getClientOriginalExtension() ?: 'png';
// 设置保存的文件名
$filename = $filename ? :date("YmdHis", time()).'_'.str_random(2);
$safeName = $filename . '.' . $extension;
// 保存文件
//$this->file->move($destinationPath, $safeName);//$destinationPath参数已经注销
Storage::putFileAs($folderName, new File($this->file), $safeName);
达维营-前端网