Laravel中Storage的putFile/putFileAs方法是否会临时存文件再传S3?
Laravel Storage putFile/putFileAs 上传S3是否会先存服务器?
核心答案
- 使用
putFile或putFileAs处理前端上传的文件时,会先把文件保存到Laravel服务器的本地临时目录,再上传至S3,无法实现直接流式上传。 - 你提到的
Storage::disk('s3')->putFileAs($dir, $file, $filename)同样会先让文件落地服务器,满足不了“不存本地”的需求。
原因说明
当传入的$file是Illuminate\Http\UploadedFile实例(前端上传的文件基本都是这个类型)时,putFile/putFileAs内部会调用UploadedFile的存储逻辑——先把文件移动到本地临时位置,再发起S3上传请求。这种处理逻辑会让大文件占用服务器磁盘空间,完全不符合流式上传的需求。
实现直接流式上传到S3的方法
放弃使用putFile/putFileAs,改用Storage::put配合文件流上传,直接将请求中的文件流传输到S3,不会在服务器生成完整的临时文件:
示例代码1:
$uploadedFile = $request->file('large_file'); // 获取文件流 $stream = fopen($uploadedFile->getRealPath(), 'r'); // 直接将流上传至S3 Storage::disk('s3')->put('uploads/large_file.ext', $stream); // 关闭流 fclose($stream);
示例代码2(更简洁):
$stream = $request->file('large_file')->getStream(); Storage::disk('s3')->put('uploads/large_file.ext', $stream);
这种方式下,文件内容会直接从前端请求流传输到S3,仅会在内存中处理部分流数据,不会占用服务器磁盘空间,适合大文件上传场景。
内容的提问来源于stack exchange,提问作者bestfirstsearch
相关产品推荐
相关产品推荐

