Двоичная запись с использованием ASP.NET в новую вкладку/окно

Я использую VB.NET для записи файла PDF непосредственно в браузер, который сразу открывает его, заменяя содержимое в текущем окне. Я пытаюсь установить параметр, который вызовет двоичную запись в новой вкладке/окне.

' Set the appropriate ContentType.
Response.ContentType = "Application/pdf"

' Write file directly to browser.
Response.BinaryWrite(binaryData)
Response.End()

Должно быть что-то, что я могу установить, что приведет к записи двоичного PDF в новом окне. Нравится Response.Target = "_blank" ?????


person Community    schedule 02.07.2014    source источник
comment
target определяется на стороне клиента в теге a. Было бы серьезным предостережением безопасности, если бы вы могли настроить таргетинг на клиентское окно из команды на стороне сервера.   -  person tgolisch    schedule 02.07.2014
comment
target определяется на стороне клиента в теге a. Было бы серьезным предостережением безопасности, если бы вы могли настроить таргетинг на клиентское окно из команды на стороне сервера. Я не понимаю, как это происходит, потому что у меня есть возможность потоковой передачи в файл PDF (я могу это сделать) или в окно браузера (я могу это сделать), я уверен, что для ContentType есть возможность настроить его на попытку открыть в новой вкладке.   -  person    schedule 02.07.2014


Ответы (3)


Сначала создайте дополнительную страницу с именем «PDF.aspx» или с любым другим именем.

Во-вторых, на своей странице сохраните переменную «binarydata» в сеансе.

Session("binaryData") = binarydata

И скажите ему перейти на вашу новую страницу.

Response.Redirect("PDF.aspx")

В-третьих, перейдите на страницу кода PDF.aspx и введите следующее:

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles       Me.Load
    Try
         Response.ContentType = "Application/pdf"
         Response.BinaryWrite(Session("binaryData"))
         Response.End()
    Catch ex As Exception
        Throw ex
    End Try
End Sub

Это должно привести к желаемому результату. :)

person Jack    schedule 02.07.2014
comment
Я думал, что будет более простой способ сделать это, но я думаю, что это единственный способ. Спасибо. - person ; 02.07.2014
comment
@МайкР. PDF.aspx, скорее всего, должен быть универсальным обработчиком (PDF.ashx), поскольку вам не нужны накладные расходы на всю страницу. - person mason; 02.07.2014
comment
@WyattTroutman Нет проблем. Универсальные обработчики очень полезны для получения документов, изображений или других двоичных файлов из базы данных. Вы даже можете использовать их для обслуживания статических (обычных файлов) и использовать их для авторизации или загрузки статистики и т. д. Одно из наиболее распространенных применений универсальных обработчиков, которое я вижу, — это извлечение изображений из базы данных для отображения в GridView с идентификатором изображения передается через строку запроса. - person mason; 03.07.2014

Я знаю, что это старо, но вот что я сделал, чтобы добиться ОП. (Извините, это C#, но преобразовать его несложно)

Это исходный код, который я использовал, который показал то же поведение, которое вы описали!

Response.ClearContent();
Response.ContentType = "application/pdf";
Response.AddHeader("Content-Disposition", "inline; filename=" + docName);
Response.AddHeader("Content-Length", byteArray.Length.ToString());
Response.BinaryWrite(byteArray);
Response.End();

Есть два ключевых изменения, которые мне пришлось внести, чтобы это работало так, как я хотел (скачать файл в формате PDF, а затем открыть в новой вкладке, когда пользователь щелкнул это вложение.) и они оба находятся в строке 3 кода выше.

Изменить это

Response.AddHeader("Content-Disposition", "inline; filename=" + docName);

К этому

Response.AddHeader("Content-Disposition", "attachment; filename=" + docName + ".pdf");

Если вы укажете Content-Disposition как "Inline", он выведет содержимое файла в ваше текущее окно.

Вам нужно изменить это расположение на "attachment" И убедиться, что суффикс вашего расширения явно установлен на .pdf.

person Bonez024    schedule 02.05.2018

Как насчет альтернативы? Напишите в браузере скрипт на стороне клиента, чтобы открыть новое окно/вкладку.

ClientScript.RegisterStartupScript(this.GetType(), "scriptkey", "window.open('MyPDFDisplayer.ashx');");

Затем создайте новый универсальный обработчик MyPDFDisplayer. ashx, который записывает PDF в окно.

context.Response.ContentType = "application/pdf";
context.Response.BinaryWrite(binaryData);
context.Response.End();

Я парень на С#, поэтому вам придется переводить, но это должно быть довольно легко.

person mason    schedule 02.07.2014