首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MemoryStream到HttpResponseMessage

MemoryStream到HttpResponseMessage
EN

Stack Overflow用户
提问于 2017-07-16 08:53:20
回答 2查看 2.5K关注 0票数 0

我已经在服务器上生成了一个Pdf,需要将它作为响应返回给我的web客户端,这样我就会得到一个“另存为”对话框。

生成pdf,并将其保存到内存流...然后将其返回给我的方法,该方法将返回HttpResponseMessage。

以下是方法:

代码语言:javascript
复制
[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断点,我会看到以下结果:

在前端脚本中,我像这样处理下载的对象:

代码语言:javascript
复制
$.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);
        });

我不确定文件在哪里被损坏了。我做错了什么?

编辑:按照建议使用以下代码:

代码语言:javascript
复制
$.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代码:

代码语言:javascript
复制
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是来自服务器的响应)。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-07-20 14:14:17

我通过使用base64编码的字符串从应用程序控制器到javascript web api调用结果“修复”了这个问题,然后允许浏览器通过指定类型(‘.Net /pdf’)将其转换为二进制文件。

票数 0
EN

Stack Overflow用户

发布于 2017-07-16 12:25:46

ContentLength设置看起来有点可疑(不是必然的):

代码语言:javascript
复制
       //content length for use in header
        var contentLength = buffer.Length;
        response.Content.Headers.ContentLength = doc.Length;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45124013

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档