我在ASP.NET MVC中将存储在数据库中的文件发送回用户时遇到问题.我想要的是一个列出两个链接的视图,一个用于查看文件并让发送给浏览器的mimetype确定应该如何处理,另一个用于强制下载.
如果我选择查看调用的文件SomeRandomFile.bak并且浏览器没有关联的程序来打开这种类型的文件,那么我没有问题,它默认为下载行为.但是,如果我选择查看调用的文件,SomeRandomFile.pdf或者SomeRandomFile.jpg我希望文件只是打开.但是我也希望将下载链接保留在一边,这样无论文件类型如何,我都可以强制下载提示.这有意义吗?
我已经尝试过FileStreamResult它适用于大多数文件,它的构造函数默认不接受文件名,因此根据url(根据内容类型不知道要提供的扩展名)为未知文件分配文件名.如果我通过指定强制文件名,我将失去浏览器直接打开文件的能力,我得到一个下载提示.有人遇到过这种情况么.
这些是我迄今为止尝试过的例子.
//Gives me a download prompt.
return File(document.Data, document.ContentType, document.Name);
Run Code Online (Sandbox Code Playgroud)
//Opens if it is a known extension type, downloads otherwise (download has bogus name and missing extension)
return new FileStreamResult(new MemoryStream(document.Data), document.ContentType);
Run Code Online (Sandbox Code Playgroud)
//Gives me a download prompt (lose the ability to open by default if known type)
return new FileStreamResult(new MemoryStream(document.Data), document.ContentType) {FileDownloadName = document.Name};
Run Code Online (Sandbox Code Playgroud)
有什么建议?
ASP.NET有四种不同类型的文件结果:
这些描述来自MSDN,除FileStreamResult外,前三个声音相同.那么他们之间有什么区别?
从服务器收到重复的标头
来自服务器的响应包含重复的标头.此问题通常是配置错误的网站或代理的结果.只有网站或代理管理员才能解决此问题.
错误349(net :: ERR_RESPONSE_HEADERS_MULTIPLE_CONTENT_DISPOSITION):收到多个不同的Content-Disposition标头.不允许这样做以防止HTTP响应分裂攻击.
我在chrome中导出为pdf时发现了这个错误.
Response.Buffer = false;
Response.ClearHeaders();
string ext = objProp.PACKAGEFILENAME.Substring(objProp.PACKAGEFILENAME.LastIndexOf("."));
string ext1 = ext.Substring(1);
Response.ContentType = ext1;
Response.AddHeader("Content-Disposition", "target;_blank,attachment; filename=" + objProp.PACKAGEFILENAME);
const int ChunkSize = 1024;
byte[] binary = objProp.PACKAGEDOCUMENT;
System.IO.MemoryStream ms = new System.IO.MemoryStream(binary);
int SizeToWrite = ChunkSize;
for (int i = 0; i < binary.GetUpperBound(0) - 1; i = i + ChunkSize)
{
if (!Response.IsClientConnected) return;
if (i + ChunkSize >= binary.Length) SizeToWrite = binary.Length - i;
byte[] chunk = new byte[SizeToWrite];
ms.Read(chunk, …Run Code Online (Sandbox Code Playgroud) 我存储了用户在 AWS S3 上上传的图像。当用户在浏览器中查看这些图像时,他们有指向我的应用程序的 url,我在那里使用 s3.getSignedUrl 重定向到一个临时签名的 url。99% 的情况下,一切都很好。
问题是,用户偶尔会上传文件名中包含逗号的图像。当他们然后尝试在 Chrome(并且只有 chrome)中查看该图像时,我收到此错误
net::ERR_RESPONSE_HEADERS_MULTIPLE_CONTENT_DISPOSITION
Run Code Online (Sandbox Code Playgroud)
我发现这是逗号,因为其他几个人也有类似的问题,他们通过设置 content-disposition 标头解决了这个问题。
使用 s3 和getSignedUrl,我认为这可以通过在 params 参数中设置 ReponseContentDisposition 属性来完成。具体的解决方法是在内容处置中正确引用文件名,或者只是将文件名设置为根本不包含逗号的其他内容。
然而,那个计划对我不起作用。有人对我可能出错的细节有任何想法吗?
我的服务器是 Node.js。这是执行重定向的 js(就像我说的通常效果很好)
function tempRedirect(req, res) {
var filename = req.params[0];
var params = {
Bucket: S3_BUCKET,
ResponseContentDisposition: 'inline; filename=' + filename.replace(/,/, '_'),
Key: checkTrailingSlash(getFileKeyDir(req)) + filename
};
var s3 = new aws.S3(s3Options);
s3.getSignedUrl('getObject', params, function(err, url) {
res.redirect(url);
});
};
Run Code Online (Sandbox Code Playgroud) asp.net-mvc ×2
http-headers ×2
amazon-s3 ×1
c# ×1
download ×1
file ×1
javascript ×1
node.js ×1
pdf ×1
resulttype ×1