模拟a标签实现下载,文件下载通过Blob对象实现

因为后端接口返回数据直接是文件的原因,并不会触发浏览器的下载。问题是AJAX并不会换起浏览器的下载窗口,AJAX设计的初衷就是用来实现异步刷新的,用以改善原始的form表单提交刷新页面的问题。

参考方式如下:

 Download(id) {
      ImageServices.DownloadImage(id).then(res => {
                if (res) {
                    const content = res;
                    // content可以是一个对象,也可以是一个数组。通过id调用返回的是一个对象,所以用第一种写法
                    // 第一种 content是对象的,则用new Blob([content])
                    const blob = new Blob([content]);
                    // 第二种 content是数组,则用new Blob([JSON.stringify(content)]);
                    //const blob = new Blob([JSON.stringify(content)]);
                    const fileName = '文件名称';
                    if ('download' in document.createElement('a')) { // 非IE下载
                        const elink = document.createElement('a');
                        elink.download = fileName
                        elink.style.display = 'none';
                        elink.href = URL.createObjectURL(blob);
                        document.body.appendChild(elink);
                        elink.click();
                        URL.revokeObjectURL(elink.href); //释放URL对象
                        document.body.removeChild(elink);
                    }
                }
            }).catch(err => {
                console.log(err)
            })
        }
}

这里用了Blob对象,该写法的意思是用从服务器接收到的文件流创建了一个blob对象,并使用该blob创建一个指向类型数组的URL,将该url作为a标签的链接目标,然后去触发a标签的点击事件从而实现下载功能。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
首先,在后端Spring Boot中,你可以使用`InputStreamResource`将对象转换为输入并返回给前端。以下是一个示例代码: ```java @GetMapping("/download") public ResponseEntity<InputStreamResource> download() throws IOException { // 创建一个对象(假设为MyObject) MyObject obj = new MyObject(); // 将对象转换为字节数组 byte[] data = SerializationUtils.serialize(obj); // 将字节数组转换为输入 InputStream inputStream = new ByteArrayInputStream(data); // 创建一个InputStreamResource对象 InputStreamResource resource = new InputStreamResource(inputStream); // 返回响应实体 return ResponseEntity.ok() .header(HttpHeaders.CONTENT_DISPOSITION, "attachment;filename=myobject.dat") .contentType(MediaType.APPLICATION_OCTET_STREAM) .contentLength(data.length) .body(resource); } ``` 在前端Vue中,你可以使用`axios`库来发出下载请求并获取对象。以下是一个示例代码: ```javascript axios({ url: 'http://localhost:8080/download', method: 'GET', responseType: 'blob' // 告诉axios响应的数据类型是二进制 }).then(response => { const blob = new Blob([response.data], {type: 'application/octet-stream'}); const objectUrl = URL.createObjectURL(blob); // 创建一个a标签模拟点击下载 const link = document.createElement('a'); link.href = objectUrl; link.download = 'myobject.dat'; document.body.appendChild(link); link.click(); // 下载完成后释放URL对象 URL.revokeObjectURL(objectUrl); }); ``` 这样就可以在前后端完成对象下载。需要注意的是,在前端中,我们将响应的数据类型设置为了`blob`,并将其转换为`Blob`对象,然后通过`URL.createObjectURL`方法生成一个URL对象并将其赋值给`a`标签的`href`属性,最后模拟点击`a`标签下载文件

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值