2017-04-10 63 views
1

我对Laravel使用Guzzle相当新颖。我目前只是将它用于我的前端和单独的REST API之间的通信。如何使用Laravel从API下载Word文档

我想从我的api下载文件,但我不知道如何去做。我可以指定文件的路径并直接下载它,但我也希望能够在浏览器中进行流式处理或查看,以便用户可以查看文档而不是下载文档。

目前我把从前端工程的GET请求(与后端做API调用)到API项目:

$resp = $client->request('GET', env('API_BASE_URL').'/project/'.$id. '/download-report', [ 'headers' => [ 'Authorization' => 'Bearer '. session()->get('api_token') ] ]); 

,在我的API后端我返回文件与 - >下载()函数。

return response()->download($report->getPath()); 

有人可以解释什么是最好的方法来处理这种情况?

这两个问题的解决方案都很棒,只需下载它,或者实际查看word文档的内容。

提前致谢!

回答

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); 
+0

感谢您的回复!我目前只是将其作为base64数据提供,并将其解码回另一端。然后将其保存到临时文件并下载。我认为这与你正在做的事情是一样的,对吧? –

+0

大致相同,但如果文件真的很大,则可以超出内存限制并崩溃。使用“sink”选项,您可以直接向文件写入字节(因为您收到它们),所以不会发生内存溢出。 –

+0

因此,我建议在应用程序内(后端和前端之间)跳过base64编码/解码,以简化设计并能够使用“sink”。 –