Problem Downloading PDF with HTTPWebRequesst

G

GJK

Hello,
I am trying to download a pdf file using HTTPWebRequest class and then
save the downloaded pdf to a SQL Server 2005 database image column and
then display the pdf on a web app.
When I try to display the PDF, Adobe reader comes up and shows an error
msg "an uncrecognized token aID was found".

Here is my code to download

Dim binByte As Byte()
ResponseStreamRdr = New StreamReader(theResponse.GetResponseStream(),
New UnicodeEncoding)
Dim objMemoryStream As New MemoryStream(New
UnicodeEncoding().GetBytes(ResponseStreamRdr.ReadToEnd()))
binByte = objMemoryStream.ToArray()
return binByte

Then I write store the binByte to an image datatype column in SQL
Server which works.

Then I try to display the pdf using the following code where I get the
error "an uncrecognized token aID was found".

byte[] bteContent = (byte[])dr["file_content"];
Response.AddHeader("Content-Disposition","attachment;filename=" +
fileName);
Response.OutputStream.Write(bteContent, 0, bteContent.Length);
Response.Flush();
Response.End();

Any idea what is wrong with the code?

Note: One thing I noticed during debugging:
theResponse.contentlength=22069 where as objMemoryStream.Length
=21890.
Does this has to do something with pdf corruption. Why is this
difference?
 
T

tdavisjr

Dont set the Content-Disposition header. Instead, set the
Response.ContentType = "application/pdf"

Everything else looks ok.
 
D

DKode

i havent palyed with SQL 2005 yet, but just a shot in the dark, you
said you were storing the data in SQL as image datatype. I think you
should try binary datatype.

thats how it was in sql2k at least, not sure if the same still holds
true to sql2005
 
J

Joerg Jooss

Thus wrote GJK,
Hello,
I am trying to download a pdf file using HTTPWebRequest class and then
save the downloaded pdf to a SQL Server 2005 database image column and
then display the pdf on a web app.
When I try to display the PDF, Adobe reader comes up and shows an
error
msg "an uncrecognized token aID was found".
Here is my code to download

Dim binByte As Byte()
ResponseStreamRdr = New
StreamReader(theResponse.GetResponseStream(),
New UnicodeEncoding)
Dim objMemoryStream As New MemoryStream(New
UnicodeEncoding().GetBytes(ResponseStreamRdr.ReadToEnd()))
binByte = objMemoryStream.ToArray()
return binByte

This will likely destroy any PDF file. You're handling PDF as UTF-16 encoded
text, but it's just binary content. Discard the StreamReader and read directly
from the response stream.

Then I write store the binByte to an image datatype column in SQL
Server which works.

Then I try to display the pdf using the following code where I get the
error "an uncrecognized token aID was found".

byte[] bteContent = (byte[])dr["file_content"];
Response.AddHeader("Content-Disposition","attachment;filename=" +
fileName);

I'm nitpicking, but use AppendHeader(). AddHeader() is an ASP legacy API.
Also, set the HTTP Content-Type header for PDF:

Response.ContentType = "application/pdf";
Response.OutputStream.Write(bteContent, 0, bteContent.Length);
Response.Flush();
Response.End();
Any idea what is wrong with the code?

No, that looks fine.
Note: One thing I noticed during debugging:
theResponse.contentlength=22069 where as objMemoryStream.Length
=21890.
Does this has to do something with pdf corruption. Why is this
difference?

See above. PDF isn't UTF-16 encoded text.

Cheers,
 
G

GJK

Thanks for all the replies. I changed the code as follows and it is
working fine.

Dim binByte As Byte()
Dim myBinaryReader As BinaryReader = New
BinaryReader(theResponse.GetResponseStream)
binByte = myBinaryReader.ReadBytes(theResponse.ContentLength)
myBinaryReader.Close()
return binByte
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,774
Messages
2,569,596
Members
45,143
Latest member
DewittMill
Top