Напишите Outputstream в новом окне - PullRequest
2 голосов
/ 07 октября 2009

Как я могу написать Outputstream в новом окне браузера?

В настоящее время у меня есть код ниже. Очевидно, он открывает поток в том же окне. Я знаю, что могу записать Outputstream в файл и открыть его в новом окне, но это не вариант.

protected void openPDF(byte[] dados) {

   HttpContext contexto = HttpContext.Current;

   contexto.Response.Clear();
   contexto.Response.AppendHeader("content-type", "application/pdf");
   contexto.Response.AppendHeader("Expires","Mon, 26 Jul 1990 05:00:00 GMT");
   contexto.Response.AppendHeader("Cache-Control","no-cache, must-revalidate");
   contexto.Response.AppendHeader("Pragma","no-cache");
   contexto.Response.Expires = -1;
   contexto.Response.AppendHeader("Content-Disposition", "inline; filename=labels.pdf");
   contexto.Response.AddHeader("content-length", dados.Length.ToString());
   contexto.Response.OutputStream.Write(dados, 0, dados.Length);
   contexto.Response.OutputStream.Flush();
   contexto.Response.End();
  }

Ответы [ 4 ]

1 голос
/ 07 октября 2009

Сервер не может сделать это один ...

Сервер отвечает только на запросы, и клиент отображает / использует эти ответы так, как считает нужным.

Вам потребуется изменить поток приложения на стороне клиента, если клиент запросит этот файл PDF (или другое содержимое) в новом окне браузера. Это можно сделать просто, например, если PDF в данный момент отправляется после того, как пользователь щелкнул ссылку, добавив добавив атрибут target = 'some_window_name' в элемент a.

Другими словами, к тому времени, когда сервер получает запрос, уже слишком поздно (*) изменять «пункт назначения» для ответа. Поэтому идея состоит в том, чтобы клиент сделал запрос из / для нового окна браузера.

(*) слишком поздно ...
Ну ... может быть, нет, кто-то может найти умный способ обернуть ответ какой-нибудь конвертом javascript, который откроет новое окно браузера и каким-то образом (?) Заполнит его содержимое содержимым PDF. Или, может быть, какой-то другой трюк ... В любом случае это, вероятно, будет несколько надуманным ... (по сравнению с тем, чтобы браузер запрашивал его в правильном контексте)

1 голос
/ 07 октября 2009

Ссылка, которая запрашивает файл, должна указывать, что вы хотите новое окно браузера.

<a href="/path/to/file" target="_blank">PDF</a>

Как только запрос отправлен на сервер, сервер просто отвечает результатом, помещая его в окно, которое его запросило, если вы не указали другую цель. Очевидно, что изменение его на вложение приведет к загрузке, но вы это знаете и хотите этого избежать.

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

0 голосов
/ 13 декабря 2013

, где вы создали файл, вы можете использовать этот код, чтобы открыть локальный файл в новом окне

Process process = new Process();
process.StartInfo.UseShellExecute = true;
process.StartInfo.FileName = outputPdfFile;
process.Start();
0 голосов
/ 07 октября 2009

Файл создается как часть обратной передачи? Если так, то это сложно; Наилучшим вариантом может быть изменение Content-Disposition на attachment, которое будет отображать диалоговое окно «Открыть / Сохранить» вместо отображения файла. Если нет, то использование target="_blank" в ссылке является решением.

...