【发布时间】:2016-02-14 11:23:59
【问题描述】:
我需要允许用户从我们的服务器下载文件,并且我想通过 ASP.NET MVC 5 控制器操作来提供这些文件。我的操作如下所示:
public FileContentResult Download(int fileId)
{
var myContent = GetContentForFile(fileId);
var myFileMeta = GetFileMeta(fileId);
if (myContent == null || myFileMeta == null)
throw new FriendlyException("The file or its associated data could not be found.");
return File(myContent.Content, myContent.MediaType, myFileMeta.FileName);
}
上面的内容很简单,它在 PC 和 iPhone 上运行良好,但在 Android 上却不行。使用 Fiddler,当我尝试下载我的一个文件时,我可以看到以下响应标头 - 在本例中是一个名为“1447114384146-643143584.jpg”的 JPG 文件:
HTTP/1.1 200 OK
Cache-Control: private, s-maxage=0
Content-Type: image/jpeg
Server: Microsoft-IIS/8.5
X-AspNetMvc-Version: 5.2
Content-Disposition: attachment; filename=1447114384146-643143584.jpg
X-AspNet-Version: 4.0.30319
X-Powered-By: ASP.NET
Date: Thu, 12 Nov 2015 23:09:00 GMT
Content-Length: 1682868
请注意,我没有任何可靠的方法可以知道正确的 MIME 类型 - 这是一个问题吗?它能否解释为什么文件没有在 Android 中下载?
澄清一下,当我尝试使用 Android 从数据库中下载任何文件时,我会收到一个 toast 通知,告诉我“下载已开始”,但随后下载会在队列中等待一段时间为 0%,然后最终更改为“失败”。
我的尝试
我尝试了人们在类似问题中提出的各种建议,其中大部分与 content-disposition 标头或 content-type 标头有关。我尝试将每个文件的content-type 标头强制为application/octet-stream,我尝试为特定文件发送正确的content-type 标头。我尝试手动发送 content-disposition 标头。我尝试将文件扩展名强制为大写。
以上都没有奏效,事实上它们都没有对问题产生任何影响,无论好坏。我很惊讶这太难了——我觉得我一定错过了一些明显的东西?
其他信息
- 浏览器:Android 上最新的 Chrome
- 操作系统:Android 5.1(也适用于使用 Android 手机的同事,该手机是早期的 Android 版本(不确定具体是哪个版本),所以我认为这与特定的 Android 版本无关)。
更新
阅读此博客条目后:http://www.digiblog.de/2011/04/android-and-the-download-file-headers/ 我尝试按照建议设置标题,完全按照建议进行设置:
HTTP/1.1 200 OK
Cache-Control: private, s-maxage=0
Content-Type: application/octet-stream
Server: Microsoft-IIS/8.5
X-AspNetMvc-Version: 5.2
Content-Disposition: attachment; filename="1447114384146-643143584.JPG"
X-AspNet-Version: 4.0.30319
X-Powered-By: ASP.NET
Date: Thu, 12 Nov 2015 23:42:18 GMT
Content-Length: 1682868
同样,这对问题没有任何影响。
进一步更新
我已经能够在 Marshmallow (Android v6.0) 设备上进行测试,并且下载工作正常。这似乎是棉花糖之前的问题。
【问题讨论】:
-
一会儿,
var?,它是 Android,它基于 Java,没有 JavaScript -
如标签所示,我正在 ASP.NET MVC 5 中开发它。(C#)(在问题中对此进行了一些澄清,因为我可以看到它的措辞令人困惑)。
-
发布下载文件的代码。
-
@BNK 我不确定你的意思 - 通过访问 URL 下载文件。您可以通过单击链接在网站中执行此操作,但您也可以使用浏览器直接浏览到文件。
标签: c# android asp.net-mvc-5