Laravel中如何实现运单PDF直接下载而非在浏览器中打开
Laravel运单PDF强制下载修改方案
核心修改逻辑
- 浏览器默认对
Content-Type: application/pdf的内容采用内嵌打开模式,只要新增Content-Disposition: attachment响应头即可触发下载 - 移除原代码中自定义的
e()输出函数,该函数输出的<pre>标签会污染PDF二进制内容,导致文件损坏 - 优先使用Laravel自带的响应方法返回内容,避免手动调用header出现的响应冲突问题
修改后完整代码
public function awb(Request $request) { $url = 'http://web.com/print/print.action'; $key = $request->key; $billCode = $key; $data = array( 'billcode' => $billCode, 'account' => 'xxx', 'password' => 'xxx', 'customercode' => 'xxx', ); $t = array( 'logistics_interface' => json_encode($data), 'msg_type' => '1', 'data_digest' => md5($billCode) ); $s = curl_init(); curl_setopt($s,CURLOPT_URL,$url); curl_setopt($s,CURLOPT_SSL_VERIFYPEER, false); curl_setopt($s,CURLOPT_RETURNTRANSFER,true); curl_setopt($s,CURLOPT_POSTFIELDS,http_build_query($t)); $r = curl_exec($s); curl_close($s); // 直接返回下载响应,文件名为运单号+运单.pdf,可自定义修改 return response()->streamDownload(function () use ($r) { echo $r; }, $billCode . '-运单.pdf', [ 'Content-Type' => 'application/pdf', ]); }
额外注意事项
- 确保curl请求返回的内容是正常的PDF二进制流,没有额外的报错输出
- 如果不需要动态生成文件名,也可以直接在第二个参数位置写死固定的PDF文件名
内容的提问来源于stack exchange,提问作者Izzat Z.
相关产品推荐
相关产品推荐

