我的.NET Core服务器上有一个PDF,我需要以某种方式通过线路发送BLOB,这样我的JS AJAX请求就可以将其转换回PDF,以便下载。
间接的原因是因为该文件来自我的API,只能通过AJAX访问。由于需要持票人令牌,我不能在幕后使用表格,因为该网站没有创建cookie。 (很奇怪,我知道,但那是现在的样子,我不打算改变这一部分)
所以,在我的C#方面,我尝试了几种变体,如下所示。 ApiResponse
只是我使用的容器,其中包含bool
和string
(名为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,并在前端重新创建它以便下载?
答案 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();