【问题标题】:Download binary file with Axios使用 Axios 下载二进制文件
【发布时间】:2018-08-08 23:07:48
【问题描述】:

例如下载PDF文件:

axios.get('/file.pdf', {
      responseType: 'arraybuffer',
      headers: {
        'Accept': 'application/pdf'
      }
}).then(response => {
    const blob = new Blob([response.data], {
      type: 'application/pdf',
    });
    FileSaver.saveAs(blob, 'file.pdf');
});

下载文件的内容是:

[object Object]

这里有什么问题?为什么二进制数据不保存到文件?

【问题讨论】:

  • 什么是 FileSaver 定义?
  • @zevee import FileSaver from 'file-saver'; 但这应该不是问题。我什至试过downloadjs库,结果是一样的
  • 说不定,这里和babel编译器有关

标签: javascript axios filesaver.js


【解决方案1】:

我能够创建一个可行的要点(不使用 FileSaver),如下所示:

axios.get("http://my-server:8080/reports/my-sample-report/",
        {
            responseType: 'arraybuffer',
            headers: {
                'Content-Type': 'application/json',
                'Accept': 'application/pdf'
            }
        })
        .then((response) => {
            const url = window.URL.createObjectURL(new Blob([response.data]));
            const link = document.createElement('a');
            link.href = url;
            link.setAttribute('download', 'file.pdf'); //or any other extension
            document.body.appendChild(link);
            link.click();
        })
        .catch((error) => console.log(error));

希望对你有帮助。

干杯!

【讨论】:

  • 谢谢。很高兴我能帮助你。干杯!
  • 谢谢,responseType: 'arraybuffer' 是我错过的。
  • responseType: 'arraybuffer' 是解决方案
  • 这也帮助我提供 Microsoft Office 文件,因此您的帖子对大家都有帮助!
  • 天啊。你是绝对的救生员。我知道这个 sn-p 甚至在我粘贴它之前就可以工作。
【解决方案2】:

我能够根据 Nayab Siddiqui 的回答下载 tgz 文件。

const fsPromises = require('fs').promises;
const axios = require('axios'); 

await axios.get('http://myServer/myFile.tgz',
        {
            responseType: 'arraybuffer', // Important
            headers: {
                'Content-Type': 'application/gzip'
            }
        })
        .then(async response => {
            await fsPromises.writeFile(__dirname + '/myFile.tgz', response.data, { encoding: 'binary' });
        })
        .catch(error => {
            console.log({ error });
        });

【讨论】:

    【解决方案3】:

    看起来 response.data 只是一个常规对象。 Blob 接受其第一个参数“ArrayBuffer、ArrayBufferView、Blob 或 DOMString 对象的数组”。

    尝试将其包装在 JSON.stringify 中

    const blob = new Blob([JSON.stringify(response.data)]
    

    那么它将满足 DOMString 要求。

    【讨论】:

      【解决方案4】:

      这种方法可能对将来寻找答案的人有所帮助。

      var axios = require("axios");
      const fs = require("fs");
      
      var config = {
        method: "get",
        url: YOUR_REQUEST_URL,
        responseType: "arraybuffer",
        headers: {
         //put your headers here if any required
        },
      };
      
      axios(config)
        .then(function (response) {
          fs.writeFileSync("/path/to/file", Buffer.from(response.data));
        })
        .catch(function (error) {
          console.log(error);
        });
      

      【讨论】:

        猜你喜欢
        • 2013-08-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-11-23
        • 1970-01-01
        相关资源
        最近更新 更多