我正在尝试从字节数组中下载文件,但提示似乎没有进行下载。我是否需要包含其他ContentDisposition属性?如果我查看IE中的网络流量,我可以看到文件请求是有效的,并且它返回了200,此外我还可以从IE Debug工具内容下载该文件。
存储在字节数组中的文件是Word文档。我将mime类型设置为:
应用/ vnd.openxmlformats-officedocument.wordprocessingml.document
文档文件名是:QuickStartGuide.docx
为什么下载提示没有出现的想法?
[HttpPost]
[ValidateAntiForgeryToken]
public FileContentResult DocumentDownload(int documentId)
{
try
{
var document = BusinessLayer.GetDocumentsByDocument(documentId, AuthenticationHandler.HostProtocol).FirstOrDefault();
System.Net.Mime.ContentDisposition contentDisposition = new System.Net.Mime.ContentDisposition();
contentDisposition.FileName = document.FileName;
contentDisposition.Inline = false;
var result = new FileContentResultWithContentDisposition(document.FileBytes, document.FileType, contentDisposition);
return result;
}
catch
{
throw;
}
}
public class FileContentResultWithContentDisposition : FileContentResult
{
private const string ContentDispositionHeaderName = "Content-Disposition";
public FileContentResultWithContentDisposition(byte[] fileContents, string contentType, ContentDisposition contentDisposition)
: base(fileContents, contentType)
{
// check for null or invalid ctor arguments
ContentDisposition = contentDisposition;
}
public ContentDisposition ContentDisposition { get; private set; }
public override void ExecuteResult(ControllerContext context)
{
// check for null or invalid method argument
ContentDisposition.FileName = ContentDisposition.FileName ?? FileDownloadName;
var response = context.HttpContext.Response;
response.ContentType = ContentType;
response.AddHeader(ContentDispositionHeaderName, ContentDisposition.ToString());
WriteFile(response);
}
}
答案 0 :(得分:4)
您的操作方法被装饰为POST
,但文件下载有GET
操作,下载也不需要防伪验证。
ASP.NET MVC框架内置了FileResult
。 MVC控制器本身已经获得了Convenince函数File(...)
(https://msdn.microsoft.com/en-us/library/system.web.mvc.controller.file(v=vs.118).aspx)
为了通知浏览器下载文件,您必须指定内容类型和下载文件名。这会将您的代码缩短为:
[HttpGet]
public FileResult DocumentDownload(int documentId)
{
var document = BusinessLayer.GetDocumentsByDocument(documentId, AuthenticationHandler.HostProtocol).FirstOrDefault();
return File(document.FileBytes, document.FileType, document.FileName);
}
答案 1 :(得分:0)
FileResult
可能更适合你。指定您的内容类型和文件名,我认为这就足够了。
public FileResult Download()
{
var document = BusinessLayer.GetDocumentsByDocument(documentId, AuthenticationHandler.HostProtocol).FirstOrDefault();
string fileName = document.FileName;
return File(document.FileBytes, System.Net.Mime.MediaTypeNames.Application.Octet, fileName);
}
我使用了一个通用的应用程序-octet mediatype,你绝对可以使用自己的。
答案 2 :(得分:0)
尝试添加"应用程序/强制下载" as"内容类型"标题的值如下所述:https://stackoverflow.com/a/3007668/5592113