Laravel 5.5批量上传文件至S3存储桶失败求助
问题:Laravel S3上传本地文件失败,是否需要先读取文件内容?
我拥有一个文件名数组:
array( 'file1.jpg', 'file2.jpg', 'file3.jpg' ),尝试通过以下循环代码将这些文件上传至S3存储桶:foreach ($filenames as $filename) { Storage::disk('s3')->put( /* S3 */ 's3foldername/' . $foldername . '/' . $filename, /* Local Storage */ storage_path('localfolder/' . $foldername . '/' . $filename), 'public' ); }但代码无法正常运行,本地路径与S3路径均验证无误,请问是否需要先读取文件内容?
哎,这个坑我之前也踩过!没错,你确实需要先处理文件内容——现在你的代码相当于把本地文件路径字符串直接传到S3了,所以S3上会生成一个内容是路径文本的文件,而不是你要上传的图片本身。
这里给你两种靠谱的解决办法:
方法一:读取文件内容后上传
用File::get()先把本地文件的内容读出来,再传给put()方法:
use Illuminate\Support\Facades\File; foreach ($filenames as $filename) { $localPath = storage_path('localfolder/' . $foldername . '/' . $filename); // 先检查文件是否存在,避免报错 if (!File::exists($localPath)) { // 可以在这里加日志记录,或者直接跳过 continue; } // 读取文件内容 $fileContent = File::get($localPath); Storage::disk('s3')->put( 's3foldername/' . $foldername . '/' . $filename, $fileContent, 'public' ); }
方法二:用更高效的putFileAs()方法
Laravel提供了putFileAs()方法,它可以直接接受本地文件路径,自动帮你处理读取和上传,而且大文件场景下内存占用更低,更推荐用这个:
use Illuminate\Support\Facades\File; foreach ($filenames as $filename) { $localPath = storage_path('localfolder/' . $foldername . '/' . $filename); if (!File::exists($localPath)) { continue; } Storage::disk('s3')->putFileAs( 's3foldername/' . $foldername, // S3上的目标文件夹 $localPath, // 本地文件的完整路径 $filename, // 要保存的文件名 'public' // 文件可见性 ); }
两种方法都能解决你的问题,个人更推荐第二种,代码更简洁,处理大文件的时候性能也更好~
内容的提问来源于stack exchange,提问作者user779681
相关产品推荐
相关产品推荐

