Symfony 3.4-将API流文件传输到客户端下载



API向我发送一个包含多个文件的zip存档的流,我通过在请求的参数SelectedIds中提供这些文件的id来选择这些文件。我收到一个PSR7响应,我将其传递给HttpFoundationFactory以返回一个与Symfony控制器应返回的内容相对应的响应。

(目标是在客户端浏览器中下载zip。(

以下是我的控制器方法的内容

$client  = $this->getApiClient();
$user    = $this->getUser();
$idList  = [51,52,53];
$psr7ApiResponse = $client->post('/v1/get-zip', [
'headers'     => [
'Authorization' => sprintf('Bearer %s', $user->getToken()),
],
'http_errors' => false,
'json'        => [
'SelectedIds' => $idList,
],
]);
$httpFoundationFactory = new HttpFoundationFactory();
return $httpFoundationFactory->createResponse($psr7ApiResponse);

它在本地工作得很好,但在服务器上我什么也没收到,空白页。你知道我应该怎么看吗,因为我没有错误日志,看起来流是空的,但我不知道如何检查。

我和邮递员一起测试了API,没问题;我的控制器也给我发了一个200的

按照以下步骤调试问题:

1.检查$psr7ApiResponse的内容是否有效和正确

你处在一个不同的环境中。可能由于某种原因,您的服务器端脚本没有收到有效的答案。也许身份验证不起作用。根据需要,将您收到的答案打印调试到一些日志文件中(使用记录器:https://symfony.com/doc/current/logging.html)。

如果调用的内容或生成的类不正确,则问题出现在远程调用通信中,您必须对此进行调试。情况很可能就是这样。

2.检查您的客户是否真正理解答案,并检查答案是否正确

你的客户绝对不应该收到空白页(这表明问题是1(。

尝试使用SymfonyComponentHttpFoundationFileFile显式返回文件。

您还可以手动将某些ZIP标头设置为Response对象,至少用于调试:

// set example variables
$filename = "zip-to-download.zip";
$filepath = "/path"; // maybe save the response to a temp file for debugging purposes

$response = $httpFoundationFactory->createResponse($psr7ApiResponse);
$response->headers->set('Pragma','public');
$response->headers->set('Expires',0);
$response->headers->set('Cache-Control','must-revalidate, post-check=0, pre-check=0');
$response->headers->set('Content-Description','File Transfer');
$response->headers->set('Content-type','application/octet-stream');
$response->headers->set('Content-Disposition','attachment; filename="'.$filename.'"');
$response->headers->set('Content-Transfer-Encoding','binary');
return $response;

最新更新