36

将数据转储到响应流中时如何指定文件名?

现在我正在做以下事情:

byte[] data= GetFoo();
Response.Clear();
Response.Buffer = true;
Response.ContentType = "application/pdf";            
Response.BinaryWrite(data);
Response.End();

使用上面的代码,我得到“foo.aspx.pdf”作为要保存的文件名。我似乎记得能够在响应中添加标头以指定要保存的文件名。

4

5 回答 5

61

向标题添加内容处置:

Response.AddHeader("content-disposition", @"attachment;filename=""MyFile.pdf""");
于 2008-09-16T16:10:34.540 回答
22

仅供参考...如果您使用“内联”而不是“附件”,该文件将在 IE 中自动打开。而不是通过打开/保存对话框提示用户。

Response.AppendHeader("content-disposition", string.Format("inline;FileName=\"{0}\"", fileName));
于 2013-01-15T21:21:47.703 回答
15
Response.AppendHeader("Content-Disposition", "attachment; filename=foo.pdf");
于 2008-09-16T16:10:04.213 回答
2

出于某种原因,那里的大多数答案似乎都没有尝试对文件名值进行编码。如果文件包含空格、分号或引号,则可能无法正确识别。

看起来您可以使用ContentDisposition该类生成正确的标头值:

Response.AppendHeader("Content-Disposition", new ContentDisposition
{
    FileName = yourFilename
}.ToString());

您可以查看源代码ContentDisposition.ToString()以确认它正在尝试对其进行正确编码。

警告:当文件名包含破折号(不是连字符)时,这似乎会崩溃。我还没有费心去研究这个。

于 2015-06-22T05:32:49.443 回答
1
 Response.AddHeader("Content-Disposition", "attachment;filename=" & FileName & ";")
于 2008-09-16T16:11:32.807 回答