上面构造函数传递的就是DomString,就是字符串。但是我们请求服务器的获取到的二进制流,可以是blob类型,也可以是arraybuffer,一般我们会在请求的时候带上 responseType参数,可以设置为’blob’ 或者 ‘arraybuffer’。
服务端代码用的是egg.js,controller代码长这样:
async downloadFile() {
const { app, ctx } = this;
const filePath = app.baseDir + '/test.pdf';
const fileSize = fs.statSync(filePath).size;
ctx.attachment(filePath);
ctx.set('Content-type', 'application/pdf');
const fileName = 'test.pdf';
ctx.set('Content-Length', fileSize);
ctx.set('Content-Disposition', `attachment; filename=${fileName}`);
ctx.body = fs.createReadStream(filePath);
前端发请求用的是axios,代码:
const downloadEvent = async () => {
let res = await axios.get(`${SERVER_HOST}/downloadFile`, {
withCredentials: true,
responseType: 'arraybuffer',
headers:{
'Access-Control-Allow-Origin':'*',
if (res) {
const blob = new Blob([res.data])
if (window.navigator.msSaveOrOpenBlob) {
window.navigator.msSaveOrOpenBlob(
blob,
`test.pdf`
} else {
const link = document.createElement('a');
const url = window.URL.createObjectURL(blob);
link.href = url;
link.download="test.pdf";
link.click();
link.remove()
使用javascript blob 下载文件模拟浏览器下载文件(不与server端交互) 纯前端的模拟一个下载文件动作 const downloadJsonFile = () => { var jStr = { hello: 'World' } var blob = new Blob([JSON.stringify(jStr, null, 2)], {type: 'application/json'}) const link = document.createElem
需求背景:今天实现一个文件下载功能,因为要对下载者进行token鉴权,而token是携带在header里面的,所以一般的方法例如用a标签,或者el-link这些都满足不了要求,只能通过ajax的方式实现,搞了一个小时,现在把前后端代码贴出来。
后端代码,后端代码没有什么特殊的
@PostMapping("/downloadFile")
public void downloadFile(@Valid @RequestBody FileDownload fileDownload, HttpServletResp
在简单的项目中下载文件的方法都是通过一个get请求来下载文件,随着前后端分离,前端使用前端框架(vue,anglajs等)之类的node.js
通过异步请求来关联前后端,下载文件的时候使用get方式请求后端下载文件时,就显得不太合适。
下面介绍如何通过ajax异步请求下载一个zip压缩文件
前端发送一个ajax请求
var self = this;
this.$http({
method:'post',
var url = "${pageContext.request.contextPath}/exportExcel/exportMemberFile";
//实现Ajax下载文件
$.fileDownload(url, {
(2)post请求, ‘application/x-www-form-urlencoded’,使用下面的方法或xhr原生
function exportData(api, params, encode) {
var form = $('<form>'); //定义一个form表
导出function download() {
var url = 'download/?filename=aaa.txt';
var xhr = new XMLHttpRequest();
xhr.open('GET', url, true); // 也可以使用POST方式,根据接口
xhr.responseType = "blob"; // 返回类型blob
要实现Spring Boot和Ajax下载Excel文件,可以按照以下步骤进行:
1. 在Controller中创建一个方法,该方法将生成Excel文件并返回文件的字节数组。例如:
```java
@GetMapping("/downloadExcel")
public ResponseEntity<byte[]> downloadExcel() throws IOException {
byte[] excelBytes = generateExcel(); // 生成Excel文件并返回字节数组
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
headers.setContentDispositionFormData("attachment", "data.xlsx"); // 设置文件名
headers.setContentLength(excelBytes.length);
return new ResponseEntity<>(excelBytes, headers, HttpStatus.OK);
2. 在前端页面中,使用Ajax发送请求并下载Excel文件。例如:
```javascript
function downloadExcel() {
$.ajax({
url: '/downloadExcel',
type: 'GET',
xhrFields: {
responseType: 'blob'
success: function(blob) {
var link = document.createElement('a');
link.href = window.URL.createObjectURL(blob);
link.download = 'data.xlsx'; // 设置文件名
link.click();
这里使用了responseType为blob的Ajax请求来接收Excel文件的二进制数据,并通过创建一个链接的方式下载文件。