我正在尝试使用来自 Web 服务的 javascript 下载文件。 Web 服务以 JSON 字符串形式返回数据,格式如下:
{
"status": "OK",
"encodedFile": "AAAAX3JlbHMvLnJlbHOtksFOwzAMhu99iij31d2QEEJNd0FIu01oPEBI3DZqE0eJB+XtiZAQDDHYgWOS358/W2m3i5/FM6bsKCi5rhspMBiyLgxKPh7uVzdy21VV+4Cz5pLJo4tZlKKQlRyZ4y1ANiN6nWuKGMpLAAAAX3JlbHMvLnJlbHOtksFOwzAMhu99iij31d2QEEJNd0FIu01oPEBI3DZqE0eJB+XtiZAQDDHYgWOS358/W2m3i5/FM6bsKCi5rhspMBiyLgxKPh7uVzdy21VV+4Cz5pLJo4tZlKKQlRyZ4y1ANiN6nWuKGMpL"
}
encodedFile 是来自 Web 服务的文件字节的 Base64 编码形式。 Web服务获取服务器中的文件,将文件转换为字节数组,然后将字节数组使用Base64编码为字符串,并以JSON格式返回响应,因此javascript获取字符串。在我得到字符串并对其进行解码(我得到文件的字节数)之后,我如何将它(字节数)作为文件下载返回?基本上,现在我有了文件的字节数,并且我想将其返回为文件下载。
我正在使用 jquery ajax 获取响应、获取“状态”和“编码文件”。任何帮助或建议将不胜感激。提前谢谢你。
最佳答案
首先,我们可以获取 Base64 编码的 blob 并对其进行解码。然后我们获取结果字符串,将其强制转换为一个无符号的 8 位字节数组(应该是这样),并从这些字节创建一个 blob。最后,我们为此 blob 创建一个 URL,并将 window.location 设置为它(尽管您可能希望改为在单独的选项卡中打开 blob)。
var data = atob("AAAAX3JlbHMvLnJlbHOtksFOwzAMhu99iij31d2QEEJNd0FIu01oPEBI3DZqE0eJB+XtiZAQDDHYgWOS358/W2m3i5/FM6bsKCi5rhspMBiyLgxKPh7uVzdy21VV+4Cz5pLJo4tZlKKQlRyZ4y1ANiN6nWuKGMpLAAAAX3JlbHMvLnJlbHOtksFOwzAMhu99iij31d2QEEJNd0FIu01oPEBI3DZqE0eJB+XtiZAQDDHYgWOS358/W2m3i5/FM6bsKCi5rhspMBiyLgxKPh7uVzdy21VV+4Cz5pLJo4tZlKKQlRyZ4y1ANiN6nWuKGMpL")
var bytes = new Array(data.length);
for (var i = 0; i < data.length; i++) {
bytes[i] = data.charCodeAt(i);
}
bytes = new Uint8Array(bytes);
var blob = new Blob([bytes]);
window.location = URL.createObjectURL(blob);
关于Javascript 从网络服务返回文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27310142/