我最近開始在現有應用程序中使用Flysystem,目的是抽象本地和遠程(特別是S3)文件系統。我的開發環境一切正常,我成功配置了LocalAdapter。但是,我無法獲得S3文件下載的工作。我想指出的是,由於我可以通過在AWS管理控制檯中手動瀏覽S3存儲桶成功下載文件,所以文件上傳工作正常。話雖如此,我將跳過初始化變量$filesystem
的代碼。Flysystem S3遠程文件下載總是損壞
我的應用程序使用PSR-7方法。也就是說,下面的代碼位於一個函數中,該函數將Psr\Http\Message\ServerRequestInterface
類型的對象作爲第一個參數傳遞,並將一個類型爲Psr\Http\Message\ResponseInterface
的對象作爲第二個參數傳遞。鑑於本地文件系統正常工作,我認爲可以肯定的是,問題不在於此。
這是代碼:
<?php
$stream = new \Zend\Diactoros\Stream($filesystem->readStream($filename));
$filesize = $stream->getSize();
return $response
->withHeader('Content-Type', 'application/pdf')
->withHeader('Content-Transfer-Encoding', 'Binary')
->withHeader('Content-Description', 'File Transfer')
->withHeader('Pragma', 'public')
->withHeader('Expires', '0')
->withHeader('Cache-Control', 'must-revalidate')
->withHeader('Content-Length', "{$filesize}")
->withBody($stream);
當我轉儲$stream
變量和$filesize
變量的結果如預期。遠程文件內容已成功打印。但是,文件下載始終損壞,文件大小始終爲0字節。
我假設Flysystem處理幕後的所有事情,並且在將其提供給客戶端之前,我不必先手動將文件下載到臨時文件夾。
任何線索可能是什麼問題?
更新1
我也曾嘗試用下面的代碼,沒有任何的運氣。然而,它繼續在當地工作:
use Zend\Diactoros\CallbackStream;
$stream = new CallbackStream(function() use ($filesystem, $filename) {
$resource = $filesystem->readStream($filename);
while (!feof($resource)) {
echo fread($resource, 1024);
}
fclose($resource);
return '';
});
和
use Zend\Diactoros\CallbackStream;
$stream = new CallbackStream(function() use ($filesystem, $filename) {
$resource = $filesystem->readStream($filename);
fpassthru($resource);
return '';
});