0

在构建带有流式内容(巨大的 xlsx 文件内容)的苗条(苗条 4)响应时遇到问题。

$fileHandler = \fopen(getenv('SHARED_FILES_PATH') . $filename, 'r');
if (!$fileHandler) {
    throw new \Exception('Unable to open file ' . getenv('SHARED_FILES_PATH') . $filename . ' for reading.');
}

$stream = GuzzleHttp\Psr7\Utils::streamFor($fileHandler);

// $this->response is Psr\Http\Message\ResponseInterface
$response = $this->response;
$response = $response->withHeader('Content-Disposition', 'attachment; filename="' . $filename . '"');
$response = $response->withHeader('Content-Type', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
$response = $response->withBody($stream);

return $response;

错误:致命错误:未捕获的 RuntimeException:无法从第 232 行的 /home/vincent/workspace/opco2i_applis/opco2i_porttail/server/vendor/guzzlehttp/psr7/src/Stream.php 中的流中读取

我做了一些检查,文件存在并且可读。如果我在 fopen 调用后执行以下操作:

$contents = '';
while (!feof($fileHandler)) {
    $contents .= fread($fileHandler, 8192);
    break;
}
fclose($fileHandler);

var_dump($contents);die();

,我可以阅读我的文件的一些内容。

你能帮我找出为什么 guzzle stream 在这种情况下不能工作吗?

4

1 回答 1

0

经过一些测试,我找到了解决方案。我必须使用 $response->getBody()->write($stream) 而不是 $response->withBody($stream);

$stream = GuzzleHttp\Psr7\Utils::streamFor($fileHandler);

// $this->response is Psr\Http\Message\ResponseInterface
$response = $this->response;
$response = $response->withHeader('Content-Disposition', 'attachment; filename="' . $filename . '"');
$response = $response->withHeader('Content-Type', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
$response = $response->getBody()->write($stream);

return $response;
于 2021-03-10T09:27:25.157 回答