下载文件时出现 "构造 'Blob' 失败:提供的值无法转换为序列" 的错误。

34

我正在尝试使用ajax/jquery下载和保存PDF文件(我知道...)。

这是我在服务器端的代码:

        public HttpResponseMessage GetPdf()
        {
            var pdf = generatePdfByteArray(); // byte[]

            var result = Request.CreateResponse(HttpStatusCode.OK);
            result.Content = new ByteArrayContent(pdf);
            //result.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment")
            //{
            //    FileName = "blah.pdf"
            //};
// tried with and without content disposition.. shouldn't matter, i think?
            result.Content.Headers.ContentType = new MediaTypeHeaderValue("application/pdf");

            return result;
        }

这是客户端代码:
    let ajaxOptions = {
    url: '/url',
    type: "GET",
    accepts: "application/pdf",
    success: (data) => {
        let blob = new Blob(data, {
            type: "application/pdf"
        }); // <-- this fails

        // stuff...
    }
};
$.ajax(ajaxOptions);

您知道这是什么问题吗?


为什么你想要Blob?只需点击调用API的锚点或按钮,浏览器就会完成REST。 - Negi Rox
1
因为我想拦截调用并在服务器出现问题时显示一条消息。 - Thinkhoop
2个回答

81

第一个参数应该是序列。

因此,这样做是行不通的:

let blob = new Blob(data, {
    type: "application/pdf"
});

但这将会:

let blob = new Blob([data], {
    type: "application/pdf"
});


兄弟,要不是你帮忙,我肯定会被困在这里好几天。 - Antoine Marques

0

这就是我最终得到的结果:

public HttpResponseMessage GetPdf()
{
    var pdf = generatePdfByteArray();

    var result = Request.CreateResponse(HttpStatusCode.OK);
    var dataStream = new MemoryStream(pdf);
    result.Content = new StreamContent(dataStream);
    result.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment")
    {
        FileName = "file.pdf"
    };
    result.Content.Headers.ContentType = new MediaTypeHeaderValue("application/pdf");

    return result;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接