如何从文件服务器中文件名包含等号的文件中下载文件?

基数

新成员
已加入
2015年9月21日
留言内容
3
编程经验
10+
我正在尝试从包含等号的文件服务器下载文件,但该文件已被剥离。我的控制器中有以下方法(请参见下面的代码)。

请注意,在高亮的代码行中,用双引号引起来的文件名对其他特殊字符($,#,@,&等),但删除了等号。


我有什么特别的事情要做,可以通过某种方式来转义等号以确保下载的文件名保留等号?


谢谢,
布拉德

---------------------------------------------

受保护的FileStreamResult StreamFileToHttpResponse(流流,字符串fileName,布尔流RawFile = false)
{
FileStreamResult nullResponse = null;
if (stream != null &&!string.IsNullOrEmpty(fileName))
{
//识别MimeType并作为附件返回浏览器
//重要提示-浏览器确定如何处理附件:
// IE可能会显示“保存”对话框
// Chrome不会显示“保存”对话框,而只是显示文件的下载。
字符串mimeType = MimeMapping.GetMimeMapping(fileName);
if (!streamRawFile)
{
Response.AppendHeader("Content-Disposition", "依恋;文件名="" + fileName + """);
Response.AppendHeader("X-Download-Options", "noopen");
}
返回File(stream,mimeType);
} else
{
return nullResponse;
}
}
 

约翰·H

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
1,050
地点
挪威
编程经验
10+
等号是普通的Ascii字符,因此在该标头中不必对此字符进行转义。本文 内容配置 headers in .NET - Softwire 建议使用Mime.ContentDisposition类(将完全转义)和带有fileDownloadName参数的File方法(也生成转义的Content-Disposition标头)来自己转义其他字符的两种方法。两者都不会对文件名中的等号做任何特殊的事情。

仍然我发现您描述的问题是在等号前后都有空格字符(任何一个都不存在)时发生的,并且我可以看到标题始终是正确的,因此我认为这是浏览器的错误。我还发现用%20替换空格可以解决此问题,这可以通过Server.UrlPathEncode(fileName)来实现。这似乎适用于IE,Edge和Chrome的所有最新浏览器版本,但不适用于Firefox。我还注意到当使用ContentDisposition类或File(...,fileDownloadName)方法实际应用特殊编码时,在任何浏览器(包括Firefox)中都不会发生此问题。

Fiddler调试器可以帮助您检查请求的传递方式,但可能不多,因为浏览器显然还是以自己的方式处理事物,并且您还可以查看保存测试时使用的实际文件名。但是,似乎使用UrlPathEncode并以File(...,fileDownloadName)生成的形式编写自己的标头应该是万能的。文件名的示例:test = test.txt
内容处置:附件;文件名* = UTF-8''test%20 =%20test.txt
 

基数

新成员
已加入
2015年9月21日
留言内容
3
编程经验
10+
谢谢JohnH!用%20替换空格可以解决等号问题。现在,我还有另外两个奇怪的角色问题。我在数据库中进行了查询,以查找所有包含特殊字符的文件名,并使用所有这些特殊字符创建了一个文件,进行了一些测试,结果是:

原始文件名
这是一个奇怪的_ =&#@,; ()-'〜+ [] filename.txt


响应头
{Server = Microsoft-IIS%2f10.0&X-AspNetMvc-Version = 2.0&内容处置=附件%3b +文件名%3d%22This%2520is%2520a%2520weird%2520_%2520%3d%2520%26%2520%23%2520%40%2520%2c%2520%3b%2520(%2520 )%2520-%2520%27%2520%7e%2520%2b%2520%5b%2520%5d%2520filename.txt%22&X-Download-Options = noopen}


铬结果-波浪号转换为破折号
这是一个奇怪的_ =&#@,; ()-'-+ [] filename.txt


IE RESULT-磅符号转换为下划线
这是一个奇怪的_ =&_ @,; ()-'〜+ [] filename.txt



如果您知道如何处理这两个问题,那么您将成为我的新好朋友。 :p

谢谢,
布拉德
 

约翰·H

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
1,050
地点
挪威
编程经验
10+
您的Content-Disposition字符串似乎有问题,但是可以从那里复制它。使用我发布的表格 依恋;文件名* = UTF-8'' +编码的文件名,但是使用Uri.EscapeDataString编码文件名,而不是我首先说的Server.UrlPathEncode。这将在IE / Edge / Firefox中产生正确的结果,但是在Chrome中,您必须接受将代字号替换为连字符,请参见 问题479419-铬-字符波浪号已转换为连字符,以在Chrome浏览器v42上下载文件名
文件名中没有井号,但数字和井号都可以。
 
最佳 底部