从 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

我似乎无法弄清楚为什么会这样。有人可以帮忙吗?

尝试添加 filenamecontent-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) + "\"");
    }
}