1

我一直在尝试根据需要生成 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>';
 ?>

这是输出:

在此处输入图像描述

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

4

3 回答 3

3

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

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

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

header('Cache-Control: private');
header('Pragma: private');  
于 2013-08-29T20:31:53.817 回答
1

也许试试这些标题?

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

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

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

于 2013-08-29T20:32:32.057 回答
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(关于Content-Disposition超文本传输​​协议 (HTTP) 中标头字段的使用)。

希望这可以帮助!

于 2013-08-29T20:31:16.120 回答