从 Internet Explorer 下载文件时出现奇怪的文件名
Weird filename when downloading file from Internet Explorer
我有一个设置了 link 的网络应用程序,当按下此 link 时,就会下载一个文件。我现在的文件位置在我自己的硬盘上。当我从 Google Chrome 下载文件时它有效,但是当我使用 IE 时,我得到一个奇怪的乱码文件名。这是我的代码:
[HttpGet]
public HttpResponseMessage GetFile(string filename, string environment)
{
_requestLogger.LogRequest(Request);
var validateResult = new InputValidator().ValidateInput(filename);
if (!validateResult.IsValid)
{
return new HttpResponseMessage { StatusCode = HttpStatusCode.BadRequest, ReasonPhrase = validateResult.ErrorMessage };
}
filename = SanitizeFileName(filename);
var filePath = _settings.ResolveFilePath(environment, filename);
if (!File.Exists(filePath))
{
return new HttpResponseMessage(HttpStatusCode.NoContent);
}
//Get file
var stream = new FileStream(filePath, FileMode.Open);
//Create result
HttpResponseMessage result = new HttpResponseMessage(HttpStatusCode.OK);
//Add content to result
result.Content = new StreamContent(stream);
result.Content.Headers.ContentType =
new MediaTypeHeaderValue("application/octet-stream");
return result;
}
这是一张 link 到一张怪异的图片 filename
我似乎无法弄清楚为什么会这样。有人可以帮忙吗?
尝试添加 filename
和 content-length
headers,如下所示:
result.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment") {
FileName = fileName.ToString()
};
response.Content.Headers.ContentLength=stream.Length.ToString();
我想出了我必须做的事情。我创建了这个方法,它解决了我的问题。
public static void AddProperFileNameHeadersIfIE(HttpContextBase httpContext, string fileName)
{
var browser = httpContext.Request.Browser;
if (browser != null && browser.Browser.Equals("ie", StringComparison.OrdinalIgnoreCase))
{
httpContext.Response.AppendHeader("Content-Disposition", "attachment; filename*=UTF-8''" + HttpUtility.UrlPathEncode(fileName) + "\"");
}
else
{
httpContext.Response.AppendHeader("Content-Disposition", "attachment; filename=\"" + HttpUtility.UrlPathEncode(fileName) + "\"");
}
}
我有一个设置了 link 的网络应用程序,当按下此 link 时,就会下载一个文件。我现在的文件位置在我自己的硬盘上。当我从 Google Chrome 下载文件时它有效,但是当我使用 IE 时,我得到一个奇怪的乱码文件名。这是我的代码:
[HttpGet]
public HttpResponseMessage GetFile(string filename, string environment)
{
_requestLogger.LogRequest(Request);
var validateResult = new InputValidator().ValidateInput(filename);
if (!validateResult.IsValid)
{
return new HttpResponseMessage { StatusCode = HttpStatusCode.BadRequest, ReasonPhrase = validateResult.ErrorMessage };
}
filename = SanitizeFileName(filename);
var filePath = _settings.ResolveFilePath(environment, filename);
if (!File.Exists(filePath))
{
return new HttpResponseMessage(HttpStatusCode.NoContent);
}
//Get file
var stream = new FileStream(filePath, FileMode.Open);
//Create result
HttpResponseMessage result = new HttpResponseMessage(HttpStatusCode.OK);
//Add content to result
result.Content = new StreamContent(stream);
result.Content.Headers.ContentType =
new MediaTypeHeaderValue("application/octet-stream");
return result;
}
这是一张 link 到一张怪异的图片 filename
我似乎无法弄清楚为什么会这样。有人可以帮忙吗?
尝试添加 filename
和 content-length
headers,如下所示:
result.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment") {
FileName = fileName.ToString()
};
response.Content.Headers.ContentLength=stream.Length.ToString();
我想出了我必须做的事情。我创建了这个方法,它解决了我的问题。
public static void AddProperFileNameHeadersIfIE(HttpContextBase httpContext, string fileName)
{
var browser = httpContext.Request.Browser;
if (browser != null && browser.Browser.Equals("ie", StringComparison.OrdinalIgnoreCase))
{
httpContext.Response.AppendHeader("Content-Disposition", "attachment; filename*=UTF-8''" + HttpUtility.UrlPathEncode(fileName) + "\"");
}
else
{
httpContext.Response.AppendHeader("Content-Disposition", "attachment; filename=\"" + HttpUtility.UrlPathEncode(fileName) + "\"");
}
}