jquery - 通过 jQuery 下载八位字节流

标签 jquery download

我已经实现了以下代码:

我有一个像这样的 html 按钮:

HTML

<button style="background-color: #f39900;" onclick="downCont()">
    Download all content
</button>

点击时调用的 downCont() 函数是一个 ajax POST,如下所示:

JQuery

var downCont = function() {
          $.ajax({
              method: "POST",
              contentType: "application/x-www-form-urlencoded",
              url: "<endpoint here>",
              data: {
                "tokenId": token,
                "downloadId": "cz98567354",
                "saveAs": "AllContents"
              }
            })
            .done(function() {
              alert("I have downloaded all contents!");
            });
        });

现在,此 POST 请求的响应用于下载图像存档,该存档将直接流式传输给用户(内容类型:application/octet-stream)。如何使用 jQuery 触发浏览器本身下载存档?

最佳答案

您需要从数据 Blob 创建一个 url ,并将其添加到 href 并触发点击。

let url;

const saveData = (() => {
  const a = document.createElement('a');
  a.style = 'display: none';
  document.body.appendChild(a);

  return (data, fileName, type = 'octet/stream') => {
    const blob = new Blob([data], { type });

    if (navigator.msSaveBlob) {
      return navigator.msSaveBlob(blob, fileName);
    }

    if (url) {
      // Keep at most 1 blob around by removing the last used one.
      URL.revokeObjectURL(url);
    }

    url = URL.createObjectURL(blob);
    a.href = url;
    a.download = fileName;
    a.click();
    return true;
  };
})();

因此这个函数将获取您的数据并执行这两个步骤,您可以像这样使用它:

$.ajax({
  method: "POST",
  contentType: "application/x-www-form-urlencoded",
  url: "<endpoint here>",
  data: {
    "tokenId": token,
    "downloadId": "cz98567354",
    "saveAs": "AllContents"
  }
})
.done((data) => saveData(data, 'myDownload.zip'));

请注意,对于不支持 Blob 的过时浏览器,还有另一种方法可以使用 base64 编码的数据字符串通过 window.open 来实现此目的。另请注意,我提供的函数使用箭头函数和默认参数,但如果您愿意,可以很容易地对其进行 ES5 化。

关于jquery - 通过 jQuery 下载八位字节流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41803925/

相关文章:

javascript - 从文件中读取 json 数据得到空白响应

javascript - 获取 ckeditor 中元素的 id

linux - 如何修改/子集 wget 脚本以指定日期范围以仅将某些年份下载到不同的脚本中?

java - 文本/csv文件下载在百行时转换为文本/纯文本

javascript - 如何防止 Bootstrap Modals 出现在浏览器历史记录中?

javascript - 从父级调用函数

javascript - 如何从 JavaScript 获取变量并将它们放入 MySQL 数据库?

javascript - 在 Ajax 成功时强制下载 .mp3 或 .zip 文件

Eclipse 更新非常慢

java - 下载多个文件 Java