使用C#作为BLOB打开文件,并使用JS作为BLOB下载

时间:2017-03-12 06:04:24

标签: javascript c# ajax download blob

我的.NET Core服务器上有一个PDF,我需要以某种方式通过线路发送BLOB,这样我的JS AJAX请求就可以将其转换回PDF,以便下载。

间接的原因是因为该文件来自我的API,只能通过AJAX访问。由于需要持票人令牌,我不能在幕后使用表格,因为该网站没有创建cookie。 (很奇怪,我知道,但那是现在的样子,我不打算改变这一部分)

所以,在我的C#方面,我尝试了几种变体,如下所示。 ApiResponse只是我使用的容器,其中包含boolstring(名为message),因此我可以判断请求是否良好。

这些是我一直在尝试的

return new ApiResponse(true, File.ReadAllText(path));
return new ApiResponse(true, Convert.ToBase64String(File.ReadAllBytes(path)));
return new ApiResponse(true, JsonConvert.SerializeObject(File.ReadAllBytes(path)));

在JS方面,按照相同的顺序解析它,我有:

// Get the response in object form, since it's sent as an ApiResponse
const response = JSON.parse(xmlhttp.response);

const text = response.message;
const text = atob(response.message)
const text = JSON.parse(response.message)

我也尝试过像

这样的事情
const text = atob(JSON.parse(response.message))

然后,我正在执行以下文字:

const blob = new Blob([text], {type: "application/pdf"});
const url = URL.createObjectURL(blob);
const a = document.createElement("a");
a.href = url;
a.download = "file.pdf";

document.body.appendChild(a);
a.click();

这样可以正确生成已下载的文件。但是,该文件无效:它已损坏。

此时我几乎陷入困境,而且我无法使用此方法从头到尾找到使用Javascript下载文件的内容。它既可以是背面,也可以是正面,但从不捆绑在一起。

那么,如何通过线路成功发送PDF BLOB,并在前端重新创建它以便下载?

1 个答案:

答案 0 :(得分:0)

如何进行转换的简单答案是不要

每个现代浏览器本身都支持base64编码,因此在将数据下载之前无需将数据转换回BLOB。

因此,结束代码是:

const a = document.createElement("a");
a.href = "data:application/pdf;base64," + response.message;
a.download = "file.pdf";

document.body.appendChild(a);
a.click();