Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/270.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript MemoryStream至HttpResponseMessage_Javascript_C#_Asp.net_Pdf - Fatal编程技术网

Javascript MemoryStream至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

我已经在服务器上生成了一个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信息,以及页面宽度和高度),但文档显示为空白

如果我取消注释被注释掉的代码,保存到本地,文件就完美了。文件大小为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()
not
doc.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;