当前位置: 首页 > 知识库问答 >
问题:

如何使用axios下载文件

鲁建茗
2023-03-14

我正在使用axios处理基本的http请求,如GET和POST,并且运行良好。现在我需要能够下载Excel文件了。axios是否可以实现这一点?如果有,有人有一些示例代码吗?如果没有,我还可以在React应用程序中使用什么来执行相同的操作?

共有3个答案

习阳
2023-03-14

当您想要使用Axios和一些安全手段下载文件时,这实际上更加复杂。为了防止其他人花太多时间来弄清楚这一点,让我给你讲一讲。

你需要做3件事:

  1. 配置您的服务器以允许浏览器查看所需的HTTP标头
  2. 实现服务器端服务,并使其为下载的文件通告正确的文件类型。
  3. 在浏览器中实现Axios处理程序以触发File下载对话框

这些步骤基本上是可行的,但由于浏览器与CORS的关系,这些步骤相当复杂。一次一步:

当采用传输安全性时,在浏览器中执行的JavaScript可以[通过设计]

为了便于讨论,让我们假设我们希望服务器在一个名为X-Suggered-filename的HTTP头中传输建议的文件名。HTTP服务器告诉浏览器,可以使用以下标头将收到的自定义标头公开给JavaScript/Axios:

Access-Control-Expose-Headers: X-Suggested-Filename

配置HTTP服务器以设置此标头的确切方式因产品而异。

看见https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Access-Control-Expose-Headers 有关这些标准标题的完整解释和详细说明。

您的服务器端服务实现现在必须执行两件事:

  1. 创建(二进制)文档并为响应分配正确的内容类型
  2. 为客户端分配包含建议文件名的自定义头(X-Suggered-Filename)

根据您选择的技术堆栈,这可以通过不同的方式完成。我将使用JavaEE 7标准绘制一个示例,该标准应生成Excel报告:

    @GET
    @Path("/report/excel")
    @Produces("application/vnd.ms-excel")
    public Response getAllergyAndPreferencesReport() {

        // Create the document which should be downloaded
        final byte[] theDocumentData = .... 

        // Define a suggested filename
        final String filename = ... 
     
        // Create the JAXRS response
        // Don't forget to include the filename in 2 HTTP headers: 
        //
        // a) The standard 'Content-Disposition' one, and
        // b) The custom 'X-Suggested-Filename'  
        //
        final Response.ResponseBuilder builder = Response.ok(
                theDocumentData, "application/vnd.ms-excel")
                .header("X-Suggested-Filename", fileName);
        builder.header("Content-Disposition", "attachment; filename=" + fileName);

        // All Done.
        return builder.build();
    }

该服务现在发出二进制文档(本例中为Excel报告),设置正确的内容类型,并发送一个自定义HTTP头,其中包含保存文档时要使用的建议文件名。

这里有一些陷阱,所以让我们确保所有细节都正确配置:

  1. 该服务响应@GET(即。HTTP GET),因此Axios调用必须是axios.get(...)。
  2. 文档以字节流的形式传输,因此您必须告诉Axios将响应视为HTML5 Blob。(即响应类型:'blob')。
  3. 在这种情况下,文件保护程序JavaScript库用于弹出打开的浏览器对话框。然而,你可以选择另一个。

然后,Axios的框架实现将大致如下:

     // Fetch the dynamically generated excel document from the server.
     axios.get(resource, {responseType: 'blob'}).then((response) => {

        // Log somewhat to show that the browser actually exposes the custom HTTP header
        const fileNameHeader = "x-suggested-filename";
        const suggestedFileName = response.headers[fileNameHeader];
        const effectiveFileName = (suggestedFileName === undefined
                    ? "allergierOchPreferenser.xls"
                    : suggestedFileName);
        console.log(`Received header [${fileNameHeader}]: ${suggestedFileName}, effective fileName: ${effectiveFileName}`);

        // Let the user save the file.
        FileSaver.saveAs(response.data, effectiveFileName);

        }).catch((response) => {
            console.error("Could not Download the Excel report from the backend.", response);
        });
钦海荣
2023-03-14

当响应带有可下载文件时,响应头将类似于

Content-Disposition: "attachment;filename=report.xls"
Content-Type: "application/octet-stream" // or Content-type: "application/vnd.ms-excel"

您可以做的是创建一个单独的组件,其中将包含一个隐藏的iframe。

  import * as React from 'react';

  var MyIframe = React.createClass({

     render: function() {
         return (
           <div style={{display: 'none'}}>
               <iframe src={this.props.iframeSrc} />
           </div>
         );
     }
  });

现在,您可以将可下载文件的url作为道具传递给该组件,因此当该组件接收到道具时,它将重新渲染并下载该文件。

编辑:您也可以使用js文件下载模块。链接到Github回购

const FileDownload = require('js-file-download');

Axios({
  url: 'http://localhost/downloadFile',
  method: 'GET',
  responseType: 'blob', // Important
}).then((response) => {
    FileDownload(response.data, 'report.csv');
});

希望这有帮助:)

薛华奥
2023-03-14

更一般的解决方案

axios({
    url: 'http://api.dev/file-download', //your url
    method: 'GET',
    responseType: 'blob', // important
}).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();
});

请在以下位置查看这些怪癖:https://gist.github.com/javilobo8/097c30a233786be52070986d8cdb1743

全部学分:https://gist.github.com/javilobo8

 类似资料:
  • 本文向大家介绍vue+axios实现文件下载及vue中使用axios的实例,包括了vue+axios实现文件下载及vue中使用axios的实例的使用技巧和注意事项,需要的朋友参考一下 功能:点击导出按钮,提交请求,下载excel文件; 第一步:跟后端童鞋确认交付的接口的response header设置了 以及返回了文件流。 第二步:修改axios请求的responseType为blob,以pos

  • 问题内容: 我正在尝试获取下载链接并下载文件。 我有一个包含以下链接的日志文件: 我有这样的代码: 到目前为止,我不知道如何获取下载链接并下载它。可以使用selenium下载文件吗? 问题答案: 根据文档,您应该配置为自动下载具有指定内容类型的文件。这是在txt文件中使用第一个URL的示例,该文件将文件保存在当前目录中: 注意,我也简化了xpath。

  • 我想用php从我的服务器下载文件。我搜索了谷歌,在这里找到了答案。这个答案表明我必须为此编写这些代码。 但我能做到这一点,只需这两行: 那么,我为什么还要像上面的代码那样多写几行呢?

  • 问题内容: 我试图使用Python从Internet下载某些内容,但我使用的是urllib模块,但无法正常工作。我希望能够将下载的文件保存到我选择的位置。如果有人可以用清晰的例子向我解释如何做到这一点,将不胜感激。 问题答案: 我建议像这样使用urllib2: 您甚至可以将其缩短为(尽管,如果您打算将每个单独的调用括在-中,则不想将其缩短):

  • 本文向大家介绍vue使用axios实现excel文件下载的功能,包括了vue使用axios实现excel文件下载的功能的使用技巧和注意事项,需要的朋友参考一下 前端VUE页面上的导出或者下载功能,一般是调用后端的一个接口,由接口生成excel,word这些文件的流信息,返回给vue,然后由vue去构建下载的动作,这边整理了一下,封装了一下,方便以后复用。 封装一个download文件 使用年月日时

  • 我正在寻找一种在python中下载pdf文件的方法,我看到了关于推荐urllib模块的其他问题的答案。我试图用它下载一个pdf文件,但是当我试图打开下载的文件时,一条消息显示该文件无法打开。 错误消息 这是我使用的代码- 我做错了什么?此外,该文件会自动保存到python文件所在的目录中。如何更改它保存到的位置? 编辑-我再次尝试使用示例pdf的链接,http://unec.edu.az/appl