如何使用Laravel

时间:2017-04-10 10:09:53

标签: php laravel ms-word guzzle

我很高兴使用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文档的内容。

提前致谢!

1 个答案:

答案 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);