如何指定可下载文件的内容类型

时间:2012-12-12 19:05:08

标签: mobile-safari mime-types passbook

SO answer适用于我,但我不知道如何“将内容类型更改为application / vnd.apple.pkpass”

目前直接链接到我的pkpass会触发下载,我不知道在哪里设置内容类型。

我已要求我的托管服务提供商验证“application / vnd.apple.pkpass”是否支持MIME类型

我试过了

从iOS 6或Mac OS 10.8点击链接时,如何将文件识别为“application / vnd.apple.pkpass”?

2 个答案:

答案 0 :(得分:4)

您需要更改Web服务器的配置才能执行此操作。如何执行此操作取决于您使用的Web服务器。如果您有一家托管公司为您管理您网站的服务器,您可能需要让他们这样做或告诉您在哪里。

许多托管公司都使用Apache作为Web服务器。如果是这样,您可以在公共HTML目录中创建.htaccess文件,并将其放入其中:

AddType application/vnd.apple.pkpass .pkpass

这将使以“.pkpass”结尾的任何文件都以该内容类型下载。

这假设您正在让客户端下载静态文件。如果您正在动态生成此文件,则根本不需要弄乱服务器,只需要发送标头即可。这取决于您正在使用的脚本语言,例如在PHP中:

header("Content-Type: application/vnd.apple.pkpass");

答案 1 :(得分:3)

如果您正在动态生成通行证,您可能会发现以下内容有助于确保每次都下载新的.pkpass,并按照Apple的建议使用最后修改的标头提供该文件。

用PHP编写,但很容易移植到其他语言。

// Assumes a .pkpass bundle named pass.pkpass in the same directory.

//Prevent caching
header("Pragma: no-cache");
header("Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0");


// Set MIME type, encoding and force download
header("Content-type: application/vnd.apple.pkpass; charset=UTF-8");
header('Content-Transfer-Encoding: binary');
header('Content-Disposition:attachment; filename="pass.pkpass"');


// Provide a content-length header based on the file size
$filesize = filesize('pass.pkpass');
if ($filesize)
  header("Content-Length: ". $filesize);


// Set a last-modified header (used by the device in update requests)
date_default_timezone_set("UTC");
header('Last-Modified: ' . date("D, d M Y H:i:s", time())) . ' GMT');


// Clear anything that may be in the output buffer and send the bundle contents
flush();
readfile('pass.pkpass');

// Do any clean up required

exit();