2008-09-16 3 views
31

Как указать имя файла при отправке данных в поток ответов?Задание имени файла для динамического PDF в asp.net

Прямо сейчас я делаю следующее:

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

С выше коде, я получаю «foo.aspx.pdf» как имя файла для сохранения. Кажется, я помню, что могу добавить заголовок для ответа, чтобы указать имя файла для сохранения.

ответ

53

Добавить контент-диспозицию к заголовку:

Response.AddHeader("content-disposition", @"attachment;filename=""MyFile.pdf"""); 
+3

Двойные кавычки должны быть размещены вокруг имени файла. См. Http://kb.mozillazine.org/Filenames_with_spaces_are_truncated_upon_download – 2008-09-16 16:33:15

15
Response.AppendHeader("Content-Disposition", "attachment; filename=foo.pdf"); 
+4

Если кто-то задается вопросом, почему существуют «AddHeader» и «AppendHeader», [интересно не больше ...] (http://msdn.microsoft.com/en-us/library/system.web.httpresponse. addheader.aspx) – 2012-01-30 23:39:42

+0

http://stackoverflow.com/a/5648407/672244 – idok 2015-05-13 18:22:13

+0

как сделать это имя файла в качестве динамического Response.AppendHeader ("Content-Disposition", "привязанность; имя файла =" + PROJNAME + " .pdf "); @ Skliwz – 2015-05-29 06:20:11

1
Response.AddHeader("Content-Disposition", "attachment;filename=" & FileName & ";") 
15

FYI ... если вы используете "инлайн" вместо "вложения" в файл будет автоматически открываться в IE. Вместо запроса пользователю диалога Open/Save.

Response.AppendHeader("content-disposition", string.Format("inline;FileName=\"{0}\"", fileName)); 
1

По какой-то причине большинство ответов, по-видимому, даже не пытаются кодировать значение имени файла. Если файл содержит пробелы, точки с запятой или кавычки, это может не совпадать правильно.

Похоже, что вы можете использовать ContentDisposition класс для создания правильного значения заголовка:

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

Вы можете проверить the source code for ContentDisposition.ToString(), чтобы подтвердить, что он пытается кодировать его правильно.

Предупреждение: Это похоже на сбой, когда имя файла содержит тире (а не дефис). Я еще не потрудился изучить это.

Смежные вопросы