dan*_*wig 12 download content-disposition asp.net-mvc-3
我们有一些文件存储在sql数据库中.在ASP.NET MVC3表单上,我们显示2个链接:
查看此文件| 下载此文件
这些链接转到这些相应的操作方法.下载按预期工作 - 单击链接会强制在浏览器中保存对话框.但是,显示会导致重复的内容处置标头发送到浏览器,导致Chrome出错,Firefox中出现空白页面.
[ActionName("display-file")]
public virtual ActionResult DisplayFile (Guid fileId, string fileName)
{
var file = _repos.GetFileInfo(fileId);
if (file != null)
{
Response.AddHeader("Content-Disposition",
string.Format("inline; filename={0}", file.Name));
return File(file.Content, file.MimeType, file.Name);
}
}
[ActionName("download-file")]
public virtual ActionResult DownloadFile (Guid fileId, string fileName)
{
var file = _repos.GetFileInfo(fileId);
if (file != null)
{
return File(file.Content, file.MimeType, file.Name);
}
}
Run Code Online (Sandbox Code Playgroud)
以下是发送到浏览器以显示操作的2个标头:
Content-Disposition: inline; filename=name-of-my-file.pdf
Content-Disposition: attachment; filename="name-of-my-file.pdf"
Run Code Online (Sandbox Code Playgroud)
我尝试更改自定义内容处置标头以用双引号包装文件名,但它仍然向浏览器发送了2个标头.我还尝试在添加自定义标头之前删除Content-Disposition标头,但是在返回FileContentResult之后会出现附件标头.
这段代码以前有用.我昨天进行了测试,发现它已不再适用于Chrome或Firefox.这可能是由于浏览器的更新.IE8和Safari仍然正确打开文件.
更新
再次感谢达林,你是对的.我们实际使用这种方法是因为您回答了另一个问题.
关于如何最终解决这个问题的更多信息,我们有一个显示文件链接的自定义路由:
context.MapRoute(null,
"path/to/display-file-attachment/{fileId}/{fileName}",
new
{
area = "AreaName",
controller = "ControllerName",
action = "DisplayFile",
}
);
Run Code Online (Sandbox Code Playgroud)
页面上的超链接通过route参数将文件名传递给action方法,因此它已经是URL的一部分.因此,我们不需要添加自定义内容处置标头,以便在用户决定下载文件时使文件名与系统匹配(通过单击浏览器PDF查看器中的保存图标).所以我们刚用过这个:
[ActionName("display-file")]
public virtual ActionResult DisplayFile (Guid fileId, string fileName)
{
var file = _repos.GetFileInfo(fileId);
if (file != null)
{
// no custom content-disposition header, and no 3rd fileName argument
return File(file.Content, file.MimeType);
}
}
Run Code Online (Sandbox Code Playgroud)
Dar*_*rov 28
当您使用重载时File(byte[] contents, string mimeType, string fileName)
,Content-Disposition
标题会自动添加到响应中attachment
,因此您无需再次添加它.因为inline
您可以使用以下重载File(byte[] contents, string mimeType)
并手动添加Content-Disposition
标头:
[ActionName("display-file")]
public virtual ActionResult DisplayFile(Guid fileId)
{
var file = _repos.GetFileInfo(fileId);
var cd = new ContentDisposition
{
Inline = true,
FileName = file.Name
};
Response.AddHeader("Content-Disposition", cd.ToString());
return File(file.Content, file.MimeType);
}
[ActionName("download-file")]
public virtual ActionResult DownloadFile(Guid fileId)
{
var file = _repos.GetFileInfo(fileId);
return File(file.Content, file.MimeType, file.Name);
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
9515 次 |
最近记录: |