Laravel Storage下载文件getContent始终返回false问题求助
问题
从FTP存储下载文件时,文件确实存在且包含内容,但调用$download->getContent()始终返回false。需要获取文件内容后通过put保存到另一个存储,已在PHPUnit和Laravel命令中测试,结果一致。
代码示例:
$ftpStorage = Storage::disk('ftp'); dump($ftpStorage->fileExists('OIP.jpeg')); // true $download = $ftpStorage->download('OIP.jpeg'); dump($download->getContent()); // false
$download的dump结果:
Symfony\Component\HttpFoundation\StreamedResponse^ {#732 // app/Console/Commands/MakePics.php:45 +headers: Symfony\Component\HttpFoundation\ResponseHeaderBag^ {#731 #headers: array:5 [ "content-type" => array:1 [ 0 => "image/jpeg" ] "content-length" => array:1 [ 0 => "13480" ] "content-disposition" => array:1 [ 0 => "attachment; filename=OIP.jpeg" ] "cache-control" => array:1 [ 0 => "no-cache, private" ] "date" => array:1 [ 0 => "Tue, 07 Mar 2023 19:40:39 GMT" ] ] #cacheControl: [] #computedCacheControl: array:2 [ "no-cache" => true "private" => true ] #cookies: [] #headerNames: array:5 [ "content-type" => "Content-Type" "content-length" => "Content-Length" "content-disposition" => "Content-Disposition" "cache-control" => "Cache-Control" "date" => "Date" ] } #content: null #version: "1.0" #statusCode: 200 #statusText: "OK" #charset: null #callback: Closure()^ {#733 class: "Illuminate\Filesystem\FilesystemAdapter" this: Illuminate\Filesystem\FilesystemAdapter {#712 …} use: { $path: "OIP.jpeg" } } #streamed: false -headersSent: false }
解决方案
这不是Laravel的已知问题,而是方法使用错误。Storage::download()返回的是Symfony\Component\HttpFoundation\StreamedResponse对象,这类响应为流式输出设计,它的getContent()方法本就会返回false——因为它没有预存内容,而是通过回调函数在响应发送时才输出文件数据。
若要获取文件内容并保存到其他存储,推荐以下几种方式:
方式1:直接获取内容(适合小文件)
$ftpStorage = Storage::disk('ftp'); $fileContent = $ftpStorage->get('OIP.jpeg'); // 保存到目标存储 Storage::disk('local')->put('saved_OIP.jpeg', $fileContent);
方式2:流式处理(适合大文件,低内存占用)
$ftpStorage = Storage::disk('ftp'); $stream = $ftpStorage->readStream('OIP.jpeg'); Storage::disk('local')->putStream('saved_OIP.jpeg', $stream); fclose($stream); // 务必关闭流资源
方式3:直接跨存储复制(最简便)
$ftpStorage = Storage::disk('ftp'); $ftpStorage->copy('OIP.jpeg', Storage::disk('local')->path('saved_OIP.jpeg'));
内容的提问来源于stack exchange,提问作者csandreas1
相关产品推荐
相关产品推荐

