我最近开始在现有应用程序中使用Flysystem,目的是抽象本地和远程(特别是S3)文件系统。在我的开发环境中一切正常,我成功配置了LocalAdapter。但是,我无法让S3文件下载工作。我想指出文件上传工作正常,因为我可以通过在AWS管理控制台中手动浏览S3存储桶来成功下载文件。话虽这么说,我将跳过初始化$filesystem
变量的代码。
我的应用程序使用的是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 '';
});
答案 0 :(得分:0)
删除Content-Length标头似乎可以解决问题。
有关详细信息,请参阅https://github.com/thephpleague/flysystem/issues/543。