Как установить имя файла при потоковой передаче PDF в браузере? - PullRequest
9 голосов
/ 06 декабря 2008

Не знаю точно, как сформулировать этот вопрос ... поэтому изменения приветствуются! Во всяком случае ... здесь идет.

В настоящее время я использую Crystal Reports для генерации PDF-файлов и просто передаю вывод пользователю. Мой код выглядит следующим образом:

System.IO.MemoryStream stream = new System.IO.MemoryStream();

stream = (System.IO.MemoryStream)this.Report.ExportToStream(CrystalDecisions.Shared.ExportFormatType.PortableDocFormat);

this.Response.Clear();
this.Response.Buffer = true;
this.Response.ContentType = "application/pdf";
this.Response.BinaryWrite(stream.ToArray());
this.Response.End();

После выполнения этого кода он передает поток PDF в браузер, открывая Acrobat Reader. Работает отлично!

Моя проблема заключается в том, что когда пользователь пытается сохранить файл, по умолчанию он использует фактическое имя файла ... в этом случае по умолчанию используется CrystalReportPage.pdf. Есть ли в любом случае, я могу установить это? Если так, то как?

Любая помощь будет оценена.

Ответы [ 2 ]

17 голосов
/ 06 декабря 2008

Обычно, через заголовок размещения контента, т.е.

Content-Disposition: inline; filename=foo.pdf

Так что просто используйте Headers.Add, AddHeader или что-то еще, с:

response.Headers.Add ("Content-Disposition", "inline; filename = foo.pdf");

(встроенное «показать в браузере», вложение «сохранить как файл»)

7 голосов
/ 06 декабря 2008
System.IO.MemoryStream stream = new System.IO.MemoryStream();

stream = (System.IO.MemoryStream)this.Report.ExportToStream(CrystalDecisions.Shared.ExportFormatType.PortableDocFormat);

this.Response.Clear();
this.Response.Buffer = true;
this.Response.ContentType = "application/pdf";
this.Response.AddHeader("Content-Disposition", "attachment; filename=\""+FILENAME+"\"");
this.Response.BinaryWrite(stream.ToArray());
this.Response.End();
...