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

Ваш ввод не является допустимым JSON, и это также не одно JSON-выражение, а несколько выражений (по одному на строку). Строки должны быть заключены в двойные кавычки, а весь список объектов должен быть в выражении [] в скобках, разделенных запятыми.

6
задан ipr101 26 September 2009 в 20:29
поделиться

4 ответа

Вместо того, чтобы перенаправить браузер в созданный файл Вы могли служить, файл сами с помощью Вас владеют 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);

Я не попробовал этот код. Это, как я думаю, что это работало бы...

6
ответ дан 8 December 2019 в 17:27
поделиться

Вдохновленный ответом 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', поскольку кажется, что это отправляет файл вниз клиенту в блоках вместо того, чтобы писать весь файл в память веб-сервера перед отправкой. Дальнейшая информация может быть найдена здесь.

5
ответ дан 8 December 2019 в 17:27
поделиться

Решение:

Response.TransmitFile(PDFFileName)
Response.Flush()
Response.Close()
File.Delete(PDFFileName)

У меня просто не работает (файл никогда не доходит до клиента). Чтение байтового массива и вызов Response.BinaryWrite тоже не вариант, поскольку файл может быть большим. Единственный способ взлома, запускающий асинхронный процесс, который ожидает освобождения файла и затем удаляет его?

Чтение байтового массива и вызов Response.BinaryWrite тоже не вариант, поскольку файл может быть большим. Единственный способ взлома, запускающий асинхронный процесс, который ожидает освобождения файла и затем удаляет его?

Чтение байтового массива и вызов Response.BinaryWrite тоже не вариант, поскольку файл может быть большим. Единственный способ взлома, запускающий асинхронный процесс, который ожидает освобождения файла и затем удаляет его?

0
ответ дан 8 December 2019 в 17:27
поделиться

Или вы могли бы просто вернуть его в браузер, не написав на диск вообще:

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);
3
ответ дан 8 December 2019 в 17:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: