PDF 文档到 WebAPI 以供下载

PDF Document to WebAPI for download

我有一个允许用户单击按钮的页面,它对生成 PDFSharp 文档对象的 .Net 后端控制器进行 WebAPI 调用。我需要 return UI 上的 Knockout/Javascript 调用方 return 对象,并显示“另存为”对话框...或者直接开始自动下载它。

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

 [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'。我如何将其转换为下载?

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