JavaScript에서 AJAX를 통해 전송되는 HTML 콘텐츠가 포함 된 PDF 파일을 생성하려고합니다..Net ApiController에서 파일 다운로드 시작
HTML을 제대로 보내고 HTML을 사용하여 PDF가 올바르게 생성되었지만 사용자 브라우저에서 파일 다운로드를 시작하는 방법을 파악하려고했습니다.
이것은 현재 내가 시도하고있는 것입니다. 이 방법은 파일의 URL을 직접 입력 할 때 IHttpHandler
파일에서 작동하지만 AJAX를 통해 게시 할 때는 ApiController
에서 작동하지 않습니다.
같은 결과를 사용하여 IHttpHandler 파일에 게시를 시도했습니다. BinaryWrite
을 사용하여 다운로드를 시작하기 전까지는 문제가 없습니다.
public class DownloadScheduleController : ApiController
{
public void Post(HtmlModel data)
{
var htmlContent = data.html;
var pdfBytes = (new NReco.PdfGenerator.HtmlToPdfConverter()).GeneratePdf(htmlContent);
using (var mstream = new System.IO.MemoryStream())
{
HttpContext.Current.Response.ContentType = "application/pdf";
HttpContext.Current.Response.AppendHeader("content-disposition", "attachment; filename=UserSchedule.pdf");
HttpContext.Current.Response.BinaryWrite(pdfBytes);
HttpContext.Current.Response.End();
}
}
}
다음은 Ajax 요청입니다. Angular의 $ http를 사용하고 있습니다.
$http({
method: 'POST',
url: 'api/downloadSchedule',
dataType: "json",
contentType: "application/json; charset=utf-8",
data: data
});
또는 PDF 바이너리를 자바 스크립트로 반환 할 수 있지만 JavaScript를 사용하여 PDF를 저장하려면 어떻게해야합니까?
도움이 될 것입니다.
필자는 바이트 스트림과 'content-disposition : attachment'를 반환하는 비 API 컨트롤러로 실제로 리디렉션하여 (301을 통해)이 작업을 수행했습니다. 나는 그것이 AJAX로 할 수 있다면 100 % 확실하지 않다. (그러나 나는 분명히 틀릴 수있다 - 여기서 기억을 떠난다.) –
예, 불행히도 AJAX를 통해 수행해야하는 상황에 처해 있습니다. PDF 생성기에 필요한 html 콘텐츠가 Javascript를 통해 다른 페이지에 동적으로로드됩니다. 그들이 다운로드 버튼을 클릭하면 iFrame을 사용하여 페이지를 트리거하고 콘텐츠를 가져오고 일단 콘텐츠가로드되면 downloadSchedule ApiController에 대한 API 호출을 트리거하는 이벤트가 발생합니다. – Kolby
나는 2 가지 일을 시도 할 것이다 : Response.Flush(); 귀하의 Response.End() 전에; 및 Response.OutputStream.Write (pdfBytes, 0, pdfBytes.Length); 대신 Response.BinaryWrite (pdfBytes) – JFlox