Stream pdf to Response

  • Thread starter Thread starter DC
  • Start date Start date
D

DC

Hi,

I am trying to load a pdf file into a memorystream and upload this file
to the browser. However, wenn I run the attached code (the ftpStream is
a valid stream of the pdf file) I receive an "Application error" in the
Adobe Reader. I tried all the default encodings and the windows
encoding (below) with the same result.

TIA for any hint on what could be wrong here.

Regards
DC



ftpStream.Seek(0, SeekOrigin.Begin);

Response.ClearContent();
Response.ClearHeaders();
Response.BufferOutput = true;
Response.ContentType = "application/pdf";
byte[] buffer = new byte[8192];

int bytesRead = ftpStream.Read(buffer, 0, 8192);
while(bytesRead > 0)
{
char[] charArray =
Encoding.GetEncoding("windows-1252").GetChars(buffer, 0, bytesRead);
Response.Write(charArray, 0, charArray.Length);

bytesRead = ftpStream.Read(buffer, 0, 8192);
}
Response.End();
 
DC,

Why are you changing the bytes from the stream into characters? There
is no reason to do this. Just send the bytes as they are to the client.
You are changing the format of the file into something that Acrobat can't
read (by converting to characters).

Also, you can't be sure that you actually read all of the bytes from the
stream. Jon Skeet has a good article on this:

http://www.pobox.com/~skeet/csharp/readbinary.html

Hope this helps.
 
You might also want to have a look at the server.transfer() method.
It's pretty useful, you know.
 
Thank you for the excellent advice Nicholas, I got it to work with
using byte arrays (see code below).

Regards
DC



byte[] buffer = new byte[8192];

ftpStream.Seek(0, SeekOrigin.Begin);

Response.ClearContent();
Response.ClearHeaders();
Response.BufferOutput = true;
Response.ContentType = "application/pdf";

int bytesRead = ftpStream.Read(buffer, 0, 8192);
while(bytesRead > 0)
{
byte[] buffer2 = new byte[bytesRead];
System.Buffer.BlockCopy(buffer, 0, buffer2, 0, bytesRead);

Response.BinaryWrite(buffer2);
Response.Flush();

bytesRead = ftpStream.Read(buffer, 0, 8192);
}
Response.End();
 
Back
Top