有时候我们要使用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);