我正在使用axios处理基本的http请求,如GET和POST,并且运行良好。现在我需要能够下载Excel文件了。axios是否可以实现这一点?如果有,有人有一些示例代码吗?如果没有,我还可以在React应用程序中使用什么来执行相同的操作?
当您想要使用Axios和一些安全手段下载文件时,这实际上更加复杂。为了防止其他人花太多时间来弄清楚这一点,让我给你讲一讲。
你需要做3件事:
这些步骤基本上是可行的,但由于浏览器与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 有关这些标准标题的完整解释和详细说明。
您的服务器端服务实现现在必须执行两件事:
根据您选择的技术堆栈,这可以通过不同的方式完成。我将使用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头,其中包含保存文档时要使用的建议文件名。
这里有一些陷阱,所以让我们确保所有细节都正确配置:
然后,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);
});
当响应带有可下载文件时,响应头将类似于
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');
});
希望这有帮助:)
更一般的解决方案
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