PDF文档到WebAPI下载

时间:2017-07-13 22:00:08

标签: javascript asp.net-web-api knockout.js pdfsharp

我有一个允许用户单击按钮的页面,它会对我的.Net后端控制器进行WebAPI调用,生成PDFSharp文档对象。我需要将该(二进制?)对​​象返回到UI上的Knockout / Javascript调用者,并显示“另存为”对话框...或者只是自动开始下载。

这是我的尝试,但它不对。

 [System.Web.Http.Route("GeneratePdf"), System.Web.Http.HttpPost]
        public HttpResponseMessage GeneratePdf(PlateTemplateExtendedDto data)
        {

            var doc = GeneratePdf(new PlateService().CreateTemplate(true), "my.pdf");

            HttpResponseMessage result = null;

            var pdfContent = new MemoryStream();
            doc.Save(pdfContent);

            result = Request.CreateResponse(HttpStatusCode.OK);
            result.Content = new StreamContent(new FileStream(pdfContent, FileMode.Open, FileAccess.Read));
            result.Content.Headers.ContentDisposition = new System.Net.Http.Headers.ContentDispositionHeaderValue("attachment");
            result.Content.Headers.ContentDisposition.FileName = "SampleImg"


            //pdfContent.Position = 0;

            var res = new HttpResponseMessage();
            res.Content = new ByteArrayContent(pdfContent.ToArray());

            HttpResponseMessage response = new HttpResponseMessage(HttpStatusCode.OK);
            res.Content.Headers.ContentDisposition = new System.Net.Http.Headers.ContentDispositionHeaderValue("attachment");
            res.Content.Headers.ContentDisposition.FileName = data.Description;
            res.Content.Headers.ContentType = new MediaTypeHeaderValue("application/pdf");

            return res;
        }

首先,行:

new StreamContent(new FileStream(pdfContent, FileMode.Open, FileAccess.Read));

无效。 ' pdfContent'我认为应该是一个字符串。

其次,我不确定如何处理' HttpResponseMessage'在前端。如何将其转换为下载?

1 个答案:

答案 0 :(得分:0)

Web api可能是这样的......

        [System.Web.Http.Route("GeneratePdf"), System.Web.Http.HttpGet]
        public IHttpActionResult GeneratePdf(PlateTemplateExtendedDto data)
        {
            var doc = GeneratePdf(new PlateService().CreateTemplate(true), "my.pdf");
            var pdfContent = new MemoryStream();
            doc.Save(pdfContent);
            var content =  new StreamContent(pdfContent);
            content.Headers.ContentDisposition = new System.Net.Http.Headers.ContentDispositionHeaderValue("attachment");
            content.Headers.ContentDisposition.FileName = data.Description;
            content.Headers.ContentType = new MediaTypeHeaderValue("application/pdf");
            content.Headers.ContentLength = pdfContent.GetBuffer().Length;
            return Ok(content);
        }

你只需将带有PlateTemplateExtendedDto参数的api url设置到客户端的window.location