javascript - 将内容类型为 'application/java-archive' 的数据转换为 blob 对象

标签 javascript html rest http

我有一个返回 JAR 文件的 GET 请求,我需要下载该文件。 下载部分最简单的方法是让浏览器按如下方式处理下载部分:

window.location.href = URL

但是,这不适用于错误处理(处理服务器错误)。

或者,I found another way它创建 blob 对象,并从该对象创建对象 URL 并将其分配给 anchor 标记以供下载 -

callSomeURL().then((res) => {
  const blob = new Blob([res._body], { type: res.headers.get('content-type') 
  });
  const url = window.URL.createObjectURL(blob);
  const linkElement = document.createElement('a');
  linkElement.setAttribute('href', url);
  linkElement.setAttribute('download', 'test jar file');
  const clickEvent = new MouseEvent('click', {view: window});
  linkElement.dispatchEvent(clickEvent);
}).catch((error) => error handling part)

内容类型是'application/java-archive' res._body 是编码后的字符串。

问题是下载的文件无效/损坏。 (不确定实现有什么问题)。

我在这里有 2 个问题 -

  1. 创建 blob 对象的正确方法是什么?它是使用响应返回的编码数据还是请求的 URL 创建的?
  2. 通过错误处理来处理文件下载的正确方法是什么?

最佳答案

您的问题是您得到的响应是纯文本/文本。 因此,当您生成 Blob 时,它仍然是纯文本,二进制数据在通过 javascript 转换为 utf16 时被破坏了。

为避免这种情况,您可以直接从 ajax 调用中将其作为 blob 请求。

使用 XMLHttpRequest,您可以设置 XHR 对象的 responseType 参数:

var xhr = new XMLHttpRequest();
xhr.open('get', your_url);
xhr.responseType = 'blob';
xhr.onload = function() {
   var blob = xhr.response;
   // do something with the blob
   var url = URL.createObjectURL(blob);
   anchor.href = url
   anchor.click();
};
xhr.send();

通过fetch API,可以调用Response对象的blob()方法

fetch(your_url)
  .then(resp => resp.blob())
  .then(doSomethingWithBlob)

关于javascript - 将内容类型为 'application/java-archive' 的数据转换为 blob 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51186137/

相关文章:

javascript - 循环内联与函数内函数?

javascript - Angular HTML 绑定(bind)不起作用

html - 在redirect_to之后 View 丢失CSS链接标签

html - 堆叠扩展 DIV

rest - 在 Wildfly 10.0 中,Java REST 线程永远处于 RUNNABLE 状态

javascript - 将元素高度设置为clientHeight导致页面滚动

javascript - Grunt 组合媒体查询 - 无法调用未定义的方法 "join"

html - 分隔 2 个 div 内容

json - 使用 REST API 删除本地/客户端对象的常用方法是什么?

jquery - 天气 API(RESTful)给出错误