【问题标题】:Javascript return file from web serviceJavascript 从 Web 服务返回文件
【发布时间】:2014-12-05 06:31:11
【问题描述】:

我正在尝试使用来自 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 来获取响应,获取“状态”,并获取“encodedFile”。任何帮助或建议将不胜感激。提前谢谢你。

【问题讨论】:

  • 我不明白。您是否正在寻找 - 在浏览器中 - 将“AAAAX3J....”转换为其本机格式,例如 '{"a":1,"name":"Matt",....}'?跨度>
  • 是的,我从 javascript 调用 Web 服务并以 JSON 格式获取响应。 Web 服务返回结果,我首先检查“状态”,如果它是“OK”,那么我得到“encodedFile”。如果“状态”是“失败”,我会收到“消息”。这就是我们开发的 Web 服务响应的格式(总是返回“状态”键)。所以现在“encodedFile”包含已使用 Base64 编码的字节数组(服务器中的文件)。从 javascript 解码后,我可以将该字节数组返回到文件吗?
  • 所以你取“encodedFile”的值,Base64-decode,内容怎么处理? “将字节数组返回到文件中”是什么意思?
  • 仅供参考,除非有充分的理由,否则这不是最好的方法。为什么不直接使用 ajax 来检索实际文件呢? Web 服务器和浏览器将根据 mime 类型处理有线编码和解码,并且 http 状态代码和标头可以很好地告诉您请求的成功程度。

标签: javascript jquery json download


【解决方案1】:

首先,我们可以获取 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);

【讨论】:

  • 你真的需要中间数组吗?为什么不'var bytes = new Uint8Array(data.length)'?
猜你喜欢
  • 1970-01-01
  • 2012-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多