Javascript MemoryStream至HttpResponseMessage
我已经在服务器上生成了一个Pdf文件,需要将其作为响应返回给我的web客户端,以便获得一个“另存为”对话框 pdf将生成,并保存到内存流中。。。然后返回到我的方法,该方法将返回HttpResponseMessage 方法如下:Javascript MemoryStream至HttpResponseMessage,javascript,c#,asp.net,pdf,Javascript,C#,Asp.net,Pdf,我已经在服务器上生成了一个Pdf文件,需要将其作为响应返回给我的web客户端,以便获得一个“另存为”对话框 pdf将生成,并保存到内存流中。。。然后返回到我的方法,该方法将返回HttpResponseMessage 方法如下: [Route("GeneratePdf"), HttpPost] public HttpResponseMessage GeneratePdf(PlateTemplateExtendedDto data) { var doc = GeneratePdf(Data
[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信息,以及页面宽度和高度),但文档显示为空白
如果我取消注释被注释掉的代码,保存到本地,文件就完美了。文件大小为228889字节。然而,当我让它进入我的网页并保存它时,它是405153字节,文件名是“未定义的”
如果我单击断点,我将看到以下结果:
在前端脚本中,我处理下载的对象如下:
$.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发送的文件,大小为227564,如果我保存它,它与磁盘上的字节大小相匹配。看来发送是可以的。但是在javascript大小上,当我读取文件时,它是424946,当我读取时:var file=newblob([data],{type:'application/pdf'});(其中数据是来自服务器的响应)。ContentLength设置看起来有点可疑(不是结果):
我通过使用从.Net控制器到javascript web api调用结果的base64编码字符串“修复”了这个问题,然后允许浏览器通过指定类型(“应用程序/pdf”)将其转换为二进制。使用
doc.ToArray()
notdoc.GetBuffer()
jQuery ajax默认情况下不处理二进制数据,另请参见@L.B和Guest——我已经尝试了你的两个想法,并编辑了我的问题。似乎我在某处丢失了一些数据。。。。PDF正在尝试渲染,但我缺少字节,所以文件似乎不知怎么被trunacted了?我已经在问题的末尾添加了细节。尝试了你们所说的所有东西,再加上更多。从api发送的文件,大小为227564,如果我保存它,它与磁盘上的字节大小相匹配。看来发送是可以的。但是在javascript大小上,当我读取文件时,它是424946,当我读取时:var file=newblob([data],{type:'application/pdf'});(其中数据是来自服务器的响应)。我将doc.Length更改为contentLength,但得到的结果相同。大小的差异是不同的,但仍然比它应该小。
//content length for use in header
var contentLength = buffer.Length;
response.Content.Headers.ContentLength = doc.Length;