从不带正文的 HTTP 响应访问文件附件

问题描述 投票:0回答:1

这与去年的这个问题本质上是相同的问题,但对于 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()
)不会显示任何看起来能让我访问附件数据的内容。

但是考虑到浏览器能够很好地下载文件,响应中必须存在“某些东西”,使得可以访问文件的实际数据,即使它不在响应正文中。所以我的问题是:

这个“东西”是什么?浏览器如何访问响应中的数据?
  1. 我可以通过某种方式从 PHP 内部访问它吗?
php laravel httpresponse attachment
1个回答
0
投票
并且响应正文为空 ...浏览器如何访问响应中的数据?

事实并非如此。您的浏览器得到的响应与 Laravel/Insomnia/Postman 不同。查看您在浏览器中发送的请求标头(提示:Firefox Web 开发人员工具比 Chrome 更容易使用 - 后者会处理它向您提供的信息)并尝试在自动请求中重新创建这些标头。

© www.soinside.com 2019 - 2024. All rights reserved.