我想构建一个 php slim 4 响应,其中包含以流模式打开的 s3 文件内容。
$s3Client = Minio::getInstance(true);
$fileHandler = \fopen('s3://' . $this->bucketName . '/' . $filename, 'r');
if (!$fileHandler) {
throw new \Exception('Unable to open file ' . 's3://' . $this->bucketName . '/' . $filename . ' for reading.');
}
$objectInfo = Minio::getHeadObject($this->bucketName, $filename, true);
$this->response = $this->response
->withHeader('Accept-Ranges', $objectInfo['AcceptRanges'])
->withHeader('Content-Length', $objectInfo['ContentLength'])
->withHeader('Content-Type', $objectInfo['ContentType'])
->withHeader('Content-Disposition', 'attachment; filename="' . $filename . '"')
->withStatus(200);
$stream = GuzzleHttp\Psr7\Utils::streamFor($fileHandler, ['size' => 1024]);
$this->response->getBody()->write($stream);
return $this->response;
如果我转储 $objectInfo 变量,则与文件相关的每个信息都是正确的。如果我转储 $stream 变量,则流为空。如果我尝试对本地文件(在我的主机上,而不是在 s3 上)执行相同的操作,则没有问题。
我的目标是允许从浏览器下载文件。该文件可能很大,所以我使用流式打开的内容(我的 s3 客户端是使用 registerStreamWrapper() 构建的)。
php 版本:7.4 guzzle:guzzlehttp/guzzle 6.5.5 slim:slim/slim 4.7.1
我不明白为什么 guzzle 不能从 s3 内容创建流。提前感谢您的建议。