I have a web page with a "download" link on it.
Using jQuery I do an Ajax Get to a ASHX file.
In the ASHX I get the Stream of the file. I then convert the stream to a byte array and return the byte array back to the calling html page;
jQuery
$(".DownloadConvertedPDF").click(function () {
var bookId = $(this).attr("bookId");
$.get('/UserControls/download.ashx?format=pdf&bookId=' + bookId, {}, function (data) { });
});
C#
context.Response.ContentType = "Application/pdf";
Stream fileStream = publishBookManager.GetFile(documentId);
byte[] buffer = new byte[16 * 1024];
using (MemoryStream ms = new MemoryStream())
{
int read;
while ((read = fileStream.Read(buffer, 0, buffer.Length)) > 0)
{
ms.Write(buffer, 0, read开发者_开发知识库);
}
}
context.Response.OutputStream.Write(buffer, 0, buffer.Length);
I don't get an error but also the PDF doesn't display on screen.
Ideally I'd like the pdf returned and the jQuery to launch the pdf in a seperate tab within the browser.
How can I make this happen or what am I doing wrong?
Try this (do not use .get
):
window.open('/UserControls/download.ashx?format=pdf&bookId=' + bookId, "pdfViewer");
To prevent the "File does not begin with '%PDF" error, use Response.BinaryWrite
:
context.Response.Clear();
context.Response.ClearContent();
context.Response.ClearHeaders();
context.Response.ContentType = "application/pdf";
Stream fileStream = publishBookManager.GetFile(documentId);
byte[] buffer = new byte[16 * 1024];
using (MemoryStream ms = new MemoryStream())
{
int read;
while ((read = fileStream.Read(buffer, 0, buffer.Length)) > 0)
{
ms.Write(buffer, 0, read);
}
}
context.Response.BinaryWrite(data);
context.Response.Flush();
Through use of context.Response.TransmitFile, a more concise way to serve a PDF from an ashx web handler is:
context.Response.Clear();
context.Response.ContentType = "application/pdf";
string filePath = System.Web.HttpContext.Current.Server.MapPath(@"~\path-to\your-file.pdf");
context.Response.TransmitFile(filePath);
i am also using window.open for getting the pdf. but it is always displayed while try to use same URL through address bar directly without logged in. how to solve this one.
精彩评论