我很高兴使用Guzzle和Laravel。我目前只是将它用于我的前端和单独的REST api之间的通信。
我试图从我的api下载文件,但我不知道如何去做。我只能指定文件的路径并直接下载它,但我也希望能够在浏览器中流式传输或查看它,这样用户就可以只查看word文档而不只是下载它。
目前我正在向api项目发送前端项目的GET请求(后端进行api调用):
$resp = $client->request('GET', env('API_BASE_URL').'/project/'.$id. '/download-report', [ 'headers' => [ 'Authorization' => 'Bearer '. session()->get('api_token') ] ]);
在我的api后端我使用 - > download()函数返回文件。
return response()->download($report->getPath());
有人可以解释一下解决这种情况的最佳方法吗?
这两个问题的解决方案都很棒,只需下载或实际查看word文档的内容。
提前致谢!
答案 0 :(得分:0)
首先,最好使用Web服务器提供文件(并将PHP保留为“更智能”工作)。它背后的想法是生成一个“安全”链接,隐藏真实文件并有一个到期超时。
有几种方法可以做到这一点(取决于你的服务器:nginx,Apache或其他)。 A good example for nginx,您只需在API中生成此类链接,然后通过您的前端将其发送给最终用户。
如果由于某些原因您更喜欢使用PHP,只需将文件下载到临时文件,然后使用response()->download()
在前端使用相应的标题(Content-Type
)发送。
$tmpFile = tempnam(sys_get_temp_dir(), 'reports_');
$resp = $client->request('GET', '...', [
// ... your options ...
'sink' => $tmpFile,
]);
response()->download(
$tmpFile,
null,
[
'Content-Type' => $resp->getHeader('Content-Type')[0]
]
)->deleteFileAfterSend(true);