Ваш ввод не является допустимым JSON, и это также не одно JSON-выражение, а несколько выражений (по одному на строку). Строки должны быть заключены в двойные кавычки, а весь список объектов должен быть в выражении [] в скобках, разделенных запятыми.
Вместо того, чтобы перенаправить браузер в созданный файл Вы могли служить, файл сами с помощью Вас владеют HttpHandler. Затем Вы могли сразу удалить файл после обслуживания его, или Вы могли даже создать файл в памяти.
Запишите файл PDF непосредственно в Клиент:
public class MyHandler : IHttpHandler {
public void ProcessRequest(System.Web.HttpContext context) {
context.Response.ContentType = "application/pdf";
// ...
PdfWriter.getInstance(document, context.Response.OutputStream);
// ...
или считайте уже сгенерированный файл 'имя файла', служите файлу, удалите его:
context.Response.Buffer = false;
context.Response.BufferOutput = false;
context.Response.ContentType = "application/pdf";
Stream outstream = context.Response.OutputStream;
FileStream instream =
new FileStream(filename, FileMode.Open, FileAccess.Read, FileShare.Read);
byte[] buffer = new byte[BUFFER_SIZE];
int len;
while ((len = instream.Read(buffer, 0, BUFFER_SIZE)) > 0) {
outstream.Write(buffer, 0, len);
}
outstream.Flush();
instream.Close();
// served the file -> now delete it
File.Delete(filename);
Я не попробовал этот код. Это, как я думаю, что это работало бы...
Вдохновленный ответом f3lix (благодарит f3lix!) я придумал следующий код VB.net -
HttpContext.Current.Response.ClearContent()
HttpContext.Current.Response.ClearHeaders()
HttpContext.Current.Response.ContentType = "application/pdf"
HttpContext.Current.Response.TransmitFile(PDFFileName)
HttpContext.Current.Response.Flush()
HttpContext.Current.Response.Close()
File.Delete(PDFFileName)
Это, кажется, работает - метод 'WriteFile', я использовал кого-либо меньше efficent что потоковые методы, используемые f3lix? Существует ли метод, доступный, это более эффективно, чем любое из наших решений?
РЕДАКТИРОВАНИЕ (19/03/2009) На основе комментариев ниже я изменил метод 'WriteFile' на 'TransmitFile', поскольку кажется, что это отправляет файл вниз клиенту в блоках вместо того, чтобы писать весь файл в память веб-сервера перед отправкой. Дальнейшая информация может быть найдена здесь.
Решение:
Response.TransmitFile(PDFFileName)
Response.Flush()
Response.Close()
File.Delete(PDFFileName)
У меня просто не работает (файл никогда не доходит до клиента). Чтение байтового массива и вызов Response.BinaryWrite тоже не вариант, поскольку файл может быть большим. Единственный способ взлома, запускающий асинхронный процесс, который ожидает освобождения файла и затем удаляет его?
Чтение байтового массива и вызов Response.BinaryWrite тоже не вариант, поскольку файл может быть большим. Единственный способ взлома, запускающий асинхронный процесс, который ожидает освобождения файла и затем удаляет его? Чтение байтового массива и вызов Response.BinaryWrite тоже не вариант, поскольку файл может быть большим. Единственный способ взлома, запускающий асинхронный процесс, который ожидает освобождения файла и затем удаляет его?Или вы могли бы просто вернуть его в браузер, не написав на диск вообще:
byte[] pdf;
using (MemoryStream ms = new MemoryStream()) {
Document doc = new Document();
PdfWriter.GetInstance(doc, ms);
doc.AddTitle("Document Title");
doc.Open();
doc.Add(new Paragraph("My paragraph."));
doc.Close();
pdf = ms.GetBuffer();
}
Response.ContentType = "application/pdf";
Response.AddHeader("Content-Disposition", "attachment;filename=MyDocument.pdf");
Response.OutputStream.Write(pdf, 0, pdf.Length);