我已经在服务器上生成了一个Pdf,需要将它作为响应返回给我的web客户端,这样我就会得到一个“另存为”对话框。
生成pdf,并将其保存到内存流...然后将其返回给我的方法,该方法将返回HttpResponseMessage。
以下是方法:
[Route("GeneratePdf"), HttpPost]
public HttpResponseMessage GeneratePdf(PlateTemplateExtendedDto data)
{
var doc = GeneratePdf(DataForThePdf);
//using (var file = File.OpenWrite("c:\\temp\\test.pdf"))
// doc.CopyTo(file); // no need for manual stream copy and buffers
HttpResponseMessage response = Request.CreateResponse(HttpStatusCode.OK);
byte[] buffer = new byte[0];
//get buffer
buffer = doc.GetBuffer();
//content length for use in header
var contentLength = buffer.Length;
response.Headers.AcceptRanges.Add("bytes");
response.StatusCode = HttpStatusCode.OK;
response.Content = new StreamContent(doc);
response.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("render");
response.Content.Headers.ContentDisposition.FileName = "yes.pdf";
response.Content.Headers.ContentType = new MediaTypeHeaderValue("application/pdf");
response.Content.Headers.ContentLength = doc.Length;
return response;
}但是,文档呈现为空白文件,尽管它具有文件大小和我创建的文档的属性(如果文件属性正确,则为pdf信息,以及页面宽度和高度),但文档仍显示为空白。
如果我将注释掉的代码取消注释,保存到本地,那么这个文件是完美的。文件大小为228,889字节。然而,当我让它转到我的网页并保存它时,它是405,153字节,文件名是“未定义的”。
如果I断点,我会看到以下结果:

在前端脚本中,我像这样处理下载的对象:
$.post("/api/PlateTemplate/GeneratePdf", data).done(function (data, status, headers) {
// headers = headers();
var filename = headers['x-filename'];
var contentType = headers['content-type'];
//Create a url to the blob
var blob = new Blob([data], { type: contentType });
var url = window.URL.createObjectURL(blob);
var linkElement = document.createElement('a');
linkElement.setAttribute('href', url);
linkElement.setAttribute("download", filename);
//Force a download
var clickEvent = new MouseEvent("click", {
"view": window,
"bubbles": true,
"cancelable": false
});
linkElement.dispatchEvent(clickEvent);
});我不确定文件在哪里被损坏了。我做错了什么?
编辑:按照建议使用以下代码:
$.post("/api/PlateTemplate/GeneratePdf", data).done(function (data, status, headers) {
alert(data.length);
var xhr = new XMLHttpRequest();
$("#pdfviewer").attr("src", URL.createObjectURL(new Blob([data], {
type: "application/pdf"
}))).Net代码:
var doc = GeneratePdf(pdfParams);
HttpResponseMessage response = Request.CreateResponse(HttpStatusCode.OK);
byte[] buffer = new byte[0];
//get buffer
buffer = doc.ToArray();
//content length for use in header
var contentLength = buffer.Length;
response.Headers.AcceptRanges.Add("bytes");
response.StatusCode = HttpStatusCode.OK;
response.Content = new StreamContent(doc);
response.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("render");
response.Content.Headers.ContentDisposition.FileName = "yes.pdf";
response.Content.Headers.ContentType = new MediaTypeHeaderValue("application/pdf");
response.Content.Headers.ContentLength = doc.Length;
return response;看起来我正在丢失数据。警报是在我从调用中得到数据之后,在我的javascript中'data.length‘的长度。文件属性是原始的pdf文件信息。

从api发送的文件,大小是227,564,如果我保存它,它与磁盘上的字节大小相匹配。所以看起来发送是正常的。但是在javascript大小上,当我读入文件时,它是424946,当我读入时: var file = new Blob( data,{ type:'application/pdf‘});(其中data是来自服务器的响应)。
发布于 2017-07-20 14:14:17
我通过使用base64编码的字符串从应用程序控制器到javascript web api调用结果“修复”了这个问题,然后允许浏览器通过指定类型(‘.Net /pdf’)将其转换为二进制文件。
发布于 2017-07-16 12:25:46
ContentLength设置看起来有点可疑(不是必然的):
//content length for use in header
var contentLength = buffer.Length;
response.Content.Headers.ContentLength = doc.Length;https://stackoverflow.com/questions/45124013
复制相似问题