PDF文档到WebAPI下载



我有一个允许用户单击按钮的页面,它对我的.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"。如何将其转换为下载?

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 在客户端

最新更新