Answers:
很好的问题...,值得更多的细节。由于一种有趣的情况,我发现自己在这里。我们通过MVC3 / C#环境提供了一些pdf附件。我们的代码已发布,我们开始从客户那里得到一些回应,这些信息是:当他们使用Chrome时下载行为异常,并且文件类型已转换为“ pdf-,attachment.pdf-,附件”。是的...你明白了...整个事情。因此,可以将其重写为“ pdf”格式,并且该文件仍会保存完整,但真是一团糟!
因此,为了描述初始情况,我们先设置“ Content-Disposition”标头,然后返回FileContentResult ...
var cd = new System.Net.Mime.ContentDisposition
{
FileName = result.Attachment.FileName,
Inline = false
};
Response.AppendHeader("Content-Disposition", cd.ToString());
return File(result.Attachment.Data, MimeExtensionHelper.GetMimeType(result.Attachment.FileName), result.Attachment.FileName);
看起来不错。在IE中工作正常。因此,我做了一些研究,并尝试实现FileStreamResult(保留Content-Disposition setter):
MemoryStream dataStream = new MemoryStream();
dataStream.Write(result.Attachment.Data, 0, result.Attachment.Data.Length);
dataStream.Position = 0;
return new FileStreamResult(dataStream, MimeExtensionHelper.GetMimeType(result.Attachment.FileName));
它已修复了Chrome中的问题!嗯...但是为什么我该不得不采取我非常好的字节数组并将其流式传输,然后通过此方法返回它才能使文件名正常工作?
然后是提琴手。
有了FileContentResult,我在标题中得到了2个Content-Dispositions。有了FileStreamResult,我得到了1。
提供文件名时,FileContentResult会附加一个Content-Disposition标头,Chrome会将此标头的倍数视为错误。
奇怪的反应...但绝对是一个很好的认识。
File
结果提供文件名意味着设置其FileDownloadName
属性,从而Content-Disposition
为您设置标题。而且它确实正确支持utf-8文件名,而该文件名没有ContentDisposition
帮助类(有关更多详细信息,请参见此处的评论)。
System.Web.MimeMapping.GetMimeMapping(filename)
如果您不能轻松访问它,则可以使用它来收集mime类型。