自定义处理程序不喜欢Firefox上的空格

问题描述

| 我有一个实现IHttpHandler的自定义处理程序。自定义处理程序使我们能够生成动态URL,供人们下载文件代码看起来像这样,
public void ProcessRequest(HttpContext context)
{
    context.response.addheader(\"Content-disposition\",\"attachment;filename=\" + attachment.FileName);
    context.response.addheader(\"Content-Length\",attachment.Fileblob.Length.ToString());
    context.Response.ContentType = GetMimeType(attachment.FileName);
    context.Response.OutputStream.Write(attachment.Fileblob,attachment.Fileblob.Length);
}
问题出在附件。文件名上。如果文件名恰好具有这样的空格, 文件名-1.bmp 然后在Internet Explorer上运行正常,但是在Firefox上,文件下载对话框将其截断了, 文件名 没有扩展名或其他任何内容。我也尝试过 attachment.FileName.Replace(\“ \”,\“%20 \”) 可以在IE中再次使用,但是在Firefox中,它导致在下载对话框中将文件名设置为此, 文件名%20-%201.bmp 我也尝试过 HttpUtility.UrlEncode(attachment.FileName) 在导致这种情况的Firefox和IE中, 文件名+-+ 1.bmp 有任何想法吗?     

解决方法

尝试用
%20
代替实际的空格字符。仍然可以在所有浏览器上使用。 编辑 好的,这似乎没有帮助。然后,计划B。 让我们尝试调整
Content-Disposition
HTTP标头,以便按照RFC 2231将附件文件名用双引号引起来。
public void ProcessRequest(HttpContext context)
{
    context.Response.AddHeader(\"Content-Disposition\",String.Format(\"attachment;filename=\\\"{0}\\\"\",attachment.FileName));
    context.Response.AddHeader(\"Content-Length\",attachment.Fileblob.Length.ToString());
    context.Response.ContentType = GetMimeType(attachment.FileName);
    context.Response.OutputStream.Write(attachment.Fileblob,attachment.Fileblob.Length);
}