php - 正确的 pdf 下载的 HTTP 标头
问题描述
我正在创建一个带有 TYPO3 扩展名“web2pdf”的 pdf 文件。我可以在桌面上下载文件,但在移动设备上出现两个不同的错误。
- IOS 只是显示与调试 $pdf 相同的代码(见下文)
- Android 取消下载并告诉我“服务器错误”
目前我只是想打印 PDF(触发器是一个前端按钮)
$pdf = $this->getResultPDF();
print($pdf)
$pdf 给我这个
string(160607) "%PDF-1.4 %���� 3 0 obj <> /Annots [ 17 0 R 18 0 R ] /Contents 4 0 R>> endobj 4 0 obj <> stream x��X�n�F�������H�����8n �Hb5]]��Ì(*!�����ʢw��y�deh����>�}Q~DjH��uk/&���$���V�yK�gWב\5���3y?�Y=��o9�s�w1�go" U4������=���+)����&��N2y��F$gs)�g9�D������5r�=�G��� �'vt}�x%��ǥ�J,�W�S19��\c��K�)�[��g��wt��ӥ��}E���\<�[�D:;P�1���գ�Ç+IJ�$!3�2���W鵙�a:�9�dj�$n����5X_��Z�_��Q�;/�X:NU��@+��l�k����RD�]�moi��\�Ͻӡ��Ň��18�"�8VqJv�k�ܘ`e��$���X��Ҽ�����NJ�a��X��O"5�,��z�b�"�d���S�}�......
正如我所说,我在桌面上工作。HTTP 标头设置为默认(内容类型:文本/html)
一旦我将 Content-Header 更改为“application/pdf”,下载就适用于所有设备。但 PDF 文件现在似乎坏了。我无法在任何程序中打开文件。
我也尝试解码 $pdf 输出并将其放入文件中(老实说,我什至不知道这可能会有所帮助):
pdf = $this->getResultPDF();
$binary = base64_decode($pdf);
file_put_contents('filename.pdf', $binary);
header('Content-disposition: attachment;filename="filename.pdf"');
header('Content-Type: application/pdf');
header('Content-Description: File Transfer');
header('Pragma: public');
print($binary);
我是否使用错误的 php 函数进行 pdf 下载?在移动设备上下载 PDF 是否需要任何特定的标题?
解决方案
应该足够了:
// force download in the browser
header('Content-Disposition: attachment; filename="filename.pdf"');
// tell the browser it's a pdf document
header('Content-Type: application/pdf');
// don't allow to cache
header('Cache-Control: private');
// if you have pdf contents in a variable report its size
// otherwise the browser won't show download progress
// you should skip this line for large files
header('Content-Length: ' . strlen($pdf));
// flush the output directly
// don't do this for large files
readfile($pathToThePdf);
// OR
// output in chunks for large files
$handle = fopen($pathToThePdf);
while (!feof($handle)) {
$buffer = fread($handle, 8192);
if (false !== $buffer) {
echo $buffer;
}
}
fclose($handle);
如果您遇到任何 500 错误,那么您应该检查错误日志中的错误,为什么会发生这种情况。
推荐阅读
- python - 使用 Sklearn 加载本地文件,尝试显示任何图像返回 emtpy
- r - 在 R 中对大数据进行高效字符串匹配(和索引)的提示?
- google-apps-script - 有没有办法让谷歌表单响应记录在表格中,具体取决于填写表格的哪个部分?
- adobe - 有没有办法在 After Effects 中移动播放头/当前时间?
- sql-server - 在 PowerShell 中使用 Invoke-Sqlcmd 时在 SQL 查询中保留注释文本?
- r - 我的数据中的一列出现错误“未知列”
- heroku - Heroku Release Phase one-off dyno 是否暴露在公共网络中?
- java - 哪种方式更好地在方法/构造函数中设置参数,有或没有 getter/setter?
- mapbox - 根据地图框中的文本输入过滤多边形
- javascript - 如何在Javascript中将文本添加到弹出窗口?