这与去年的这个问题本质上是相同的问题,但对于 PHP(特别是 Laravel)来说,这个问题没有任何答案。
我有一个应该返回 Excel 文件的外部 URL。在浏览器中正确访问 URL 会下载包含正确内容的文件(大小约为 270 KB),但尝试通过 HTTP 请求获取文件内容时,我的运气不太好。
请求位于 Laravel 应用程序中,因此如果可能的话,我更愿意使用 Laravel 的 HTTP 客户端,但如果需要的话,我会采用 cURL 甚至
file_get_contents
答案。
当我通过 Insomnia 或 Postman 发送请求并检查时间线时,我得到的是:
> GET /path/to/file.do?file=xyz.xls HTTP/1.1
> Host: remote.host.example.com
> User-Agent: insomnia/2023.4.0
> Authorization: Basic [redacted]
> Accept: */*
* TLSv1.2 (IN), TLS header, Supplemental data (23):
* Mark bundle as not supporting multiuse
< HTTP/1.1 200 OK
< Date: Fri, 08 Sep 2023 10:56:07 GMT
< Server: Apache
* TLSv1.2 (IN), TLS header, Supplemental data (23):
< Content-Disposition: attachment; filename =xyz.xls
< Set-Cookie: RPGSPSESSIONID=[redacted];
< Transfer-Encoding: chunked
< Content-Type: application/xls
* TLSv1.2 (IN), TLS header, Supplemental data (23):
* Received 5 B chunk
它有
content-disposition: attachment; filename=xyz.xls
,但根本没有 Content-Length
标头,并且响应正文为空。
由于主体是空的,显然,这只是返回一个空字符串:
Http::withBasicAuth('un', 'pw')
->get('https://remote.host.example.com/path/to/file.do?file=xyz.xls')
->body();
检查调用本身返回的 HTTPResponse 对象(没有
->body()
)不会显示任何看起来能让我访问附件数据的内容。
但是考虑到浏览器能够很好地下载文件,响应中必须存在“某些东西”,使得可以访问文件的实际数据,即使它不在响应正文中。所以我的问题是:
这个“东西”是什么?浏览器如何访问响应中的数据?事实并非如此。您的浏览器得到的响应与 Laravel/Insomnia/Postman 不同。查看您在浏览器中发送的请求标头(提示:Firefox Web 开发人员工具比 Chrome 更容易使用 - 后者会处理它向您提供的信息)并尝试在自动请求中重新创建这些标头。