Запись потока PDF в поток ответов

Если у меня есть файл pdf в виде потока, как я могу записать его в выходной поток ответа?

Ответы

Ответ 1

Поскольку вы используете MVC, лучший способ - использовать FileStreamResult:

return new FileStreamResult(stream, "application/pdf")
{
    FileDownloadName = "file.pdf"
};

Воспроизведение с помощью Response.Write или Response.OutputStream с вашего контроллера не является идиоматическим, и нет причин писать собственный ActionResult, если он уже существует.

Ответ 2

Один из способов сделать это:

//assuming you have your FileStream handle already - named fs
byte[] buffer = new byte[4096];
long count = 0;

while ((count = fs.Read(buffer, 0, buffer.Length)) > 0)
{
    response.OutputStream.Write(buffer, 0, count);
    response.Flush();
}

Вы также можете использовать сжатие GZIP для ускорения передачи файла клиенту (меньше байтов).

Ответ 3

В asp.net это способ загрузить pdf файл

    Dim MyFileStream As FileStream
    Dim FileSize As Long

    MyFileStream = New FileStream(filePath, FileMode.Open)
    FileSize = MyFileStream.Length

    Dim Buffer(CInt(FileSize)) As Byte
    MyFileStream.Read(Buffer, 0, CInt(FileSize))
    MyFileStream.Close()

    Response.ContentType = "application/pdf"
    Response.OutputStream.Write(Buffer, 0, FileSize)
    Response.Flush()
    Response.Close()

Ответ 4

HTTP-ответ - это поток, открытый вам через свойство HttpContext.Response.OutputStream, поэтому, если у вас есть файл PDF в потоке, вы можете просто скопировать данные из одного потока в другой:

CopyStream(pdfStream, response.OutputStream);

Для реализации CopyStream см. Лучший способ копирования между двумя экземплярами Stream - С#

Ответ 5

Попробуйте следующее:

    protected void Page_Load(object sender, EventArgs e) {
        Context.Response.Buffer = false;
        FileStream inStr = null;
        byte[] buffer = new byte[1024];
        long byteCount; inStr = File.OpenRead(@"C:\Users\Downloads\sample.pdf");
        while ((byteCount = inStr.Read(buffer, 0, buffer.Length)) > 0) {
            if (Context.Response.IsClientConnected) {
                Context.Response.ContentType = "application/pdf";
                Context.Response.OutputStream.Write(buffer, 0, buffer.Length);
                Context.Response.Flush();
            }
        }
    }