gpt4 book ai didi

asp.net-mvc-3 - 如何使用 MVC3 FileContentResult 避免重复的内容处置 header ?

转载 作者:行者123 更新时间:2023-12-04 00:11:55 25 4
gpt4 key购买 nike

我们有一些文件存储在 sql 数据库中。在 ASP.NET MVC3 表单上,我们显示 2 个链接:

查看此文件 |下载这个文件

这些链接指向这些相应的操作方法。下载按预期工作——单击链接会强制浏览器中出现保存对话框。但是,显示会导致重复的 Content-Disposition header 发送到浏览器,从而导致 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);
}
}

以下是发送到浏览器用于显示操作的 2 个 header :
Content-Disposition: inline; filename=name-of-my-file.pdf
Content-Disposition: attachment; filename="name-of-my-file.pdf"

我尝试更改我的自定义内容处置 header 以将文件名用双引号括起来,但它仍然向浏览器发送了 2 个 header 。我还尝试在添加自定义 header 之前删除 Content-Disposition header ,但似乎在返回 FileContentResult 后添加了附件 header 。

此代码曾经有效。我昨天刚刚进行了一个测试,发现它在 Chrome 或 Firefox 中不再有效。这可能是由于浏览器中的更新。 IE8 和 Safari 仍然可以正确打开文件。

更新

再次感谢达林,你是对的。我们实际上使用这种方法是因为 another question you answered .

关于我们最终如何解决这个问题的更多信息,我们有一个用于显示文件链接的自定义路由:
context.MapRoute(null,
"path/to/display-file-attachment/{fileId}/{fileName}",
new
{
area = "AreaName",
controller = "ControllerName",
action = "DisplayFile",
}
);

页面上的超链接通过路由参数将文件名传递给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);
}
}

最佳答案

当您使用重载时 File(byte[] contents, string mimeType, string fileName) Content-Disposition header 会自动添加到响应中 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);
}

关于asp.net-mvc-3 - 如何使用 MVC3 FileContentResult 避免重复的内容处置 header ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8616691/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com