Запись потока 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();
}
}
}