开发者

Return PDF to WebPage from ASHX

开发者 https://www.devze.com 2023-03-29 09:42 出处:网络
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

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.

0

精彩评论

暂无评论...
验证码 换一张
取 消