iOS 上的 Safari 是否拒绝下载 `application/octet-stream` 类型的内容?

4

我有一个基于Node.js中标准的http模块编写的Web服务器。它一直很好地为我服务,用于提供各种HTML、JavaScript、CSS和资产内容——这些自然组成了我的网页大部分。

当请求映射到没有已知扩展名的文件的URL时(没有进行MIME嗅探),它会简单地使用分块传输编码来提供内容,并使用头部字段Content-Type: application/octet-stream。这也一直非常好地工作——我偶尔会在服务器上托管各种类型的文件,并能够按预期从application/octet-stream处理中下载这些文件而不受用户代理的干扰。

然而,今天我尝试在运行iOS 9.3.5的iPhone 4S上的Safari移动浏览器中下载文件,结果它就是死活不下载,还提示我:

下载失败。Safari无法下载此文件。

我随后尝试添加了Content-Disposition: attachmentContent-Disposition: attachment; filename="foobar",以防万一,但它仍然拒绝下载。

这是发生在一个名为random的文件上,其中填充了1000个随机字节。我的主机头部字段是(如上所述,Content-Disposition是可选的):

HTTP/1.1 200 OK
Host: example.com
Content-Type: application/octet-stream
Content-Disposition: attachment; filename="foobar"
Date: Mon, 01 May 2017 13:48:37 GMT
Connection: keep-alive
Transfer-Encoding: chunked

记录一下,Android 6.x手机也表现正常(除了我的Windows 10 x86_64主机上的Firefox 53之外),从URL下载没有问题。

Safari这里出了什么问题?

2个回答

5
是的,在iOS上,你唯一可以通过Safari下载的是图片。这是因为iOS不向用户公开文件结构(将文件下载到用户永远看不到的地方毫无意义),这与反网络攻击无关。Android上的浏览器可以下载任意文件,因为Android的文件结构对用户可见。
以下是苹果社区先前的讨论:https://discussions.apple.com/thread/3697948?start=0&tstart=0

你唯一可以从Safari保存到iPhone的是图片。没有其他东西,也没有下载。

未来可能会支持下载iOS支持的视频文件,但不太可能支持具有application/octet-stream MIME类型的任意文件。

谢谢,这正是我想知道的。 - Armen Michaeli

0

在我花费了很多时间寻找解决方案之后,我得出了这个解决方案:

将八位字节流替换为 PDF。

<?php
$file = 'data/report/foobar.pdf';

header('Content-Description: File Transfer');
header('Content-Type: application/pdf');
header('Content-Disposition: attachment; filename="'.$file.'"');
header('Expires: 0');
header('Cache-Control: must-revalidate');
header('Pragma: public');
header('Content-Length: '.filesize($file));
readfile($file);

?>


1
你正在将任意数据作为PDF提供? - Armen Michaeli

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接