为什么此代码没有将文件下载到我的浏览器?

时间:2013-08-29 20:28:09

标签: php download plist

我一直在尝试按需生成并输出plist文件给用户。当用户单击按钮时,我运行以下代码:

<?php
    header('Content-Description: File Transfer');
    header('Content-Type: application/xml');
    header('Content-Disposition: filename="Settings.plist"');

    echo '<?xml version="1.0" encoding="UTF-8"?>
          <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
          <plist version="1.0">
          <dict>
              <key>key</key>
              <string>value</string>
          </dict>
          </plist>';
 ?>

这是输出:

enter image description here

启动文件下载需要做什么?

3 个答案:

答案 0 :(得分:3)

您输出的Content-Disposition标题不太正确。 (有关完整的详细规范,请参阅RFC 6266。)应该是:

header('Content-Disposition: attachment; filename=Settings.plist');

您可能还希望确保不通过以下方式缓存文件:

header('Cache-Control: private');
header('Pragma: private');  

答案 1 :(得分:1)

也许试试这些标题?

header('Content-type: application/octet-stream; charset=utf-8');
header('Content-Disposition: attachment; filename="Settings.' . date('Y-m-d H:i:s') . '.plist"');

我也将日期附加到文件名,以防止浏览器缓存文件,如果有人多次下载该文件。

还要确保在输出标题之前没有内容(空格)返回浏览器。

答案 2 :(得分:0)

您用于Content Disposition标头的语法错误。看起来您忘记添加Content-Disposition: attachment位。

RFC 6266通过示例显示语法:

Content-Disposition: Attachment; filename=example.html

你现在正在做:

header('Content-Disposition: filename="Settings.plist"');
                            ^

这应该是:

header('Content-Disposition: Attachment; filename="Settings.plist"');

完整代码:

header('Content-Description: File Transfer');
header('Content-Type: application/xml');
header('Content-Disposition: Attachment; filename="Settings.plist"');

有关详细信息,请参阅RFC 6266(关于在超文本传输​​协议(HTTP)中使用Content-Disposition标头字段)。

希望这有帮助!