我最近开始在现有应用程序中使用 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 '';
});