前端几种下载文件的方式(url方式和文件流方式)

文章详细介绍了前端实现文件下载的四种方式,包括利用window.location.href、window.open()、a标签以及处理文件流的方法。对于不同类型的文件,如浏览器能预览的和不能预览的,文章提供了相应的解决方案,并给出了具体的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前端实现下载功能是依赖于浏览器特性,而非JS特性
前端如何实现文件下载,防止浏览器自动打开可预览文件
https://blog.csdn.net/weixin_46074961/article/details/105677732


1.location.href
下载文件–window-location-href

对于浏览器不能打开的文件(例如:.rar .doc等)是可以实现文件下载的,但是对于浏览器可以打开的(例如:.txt .xml等)只可以实现预览功能

window.location.href="https://106.14.15.103:8000/downloadFile/test"

2.window.open()

Window 接口的 open() 方法,是用指定的名称将指定的资源加载到浏览器上下文(窗口 window ,内嵌框架 iframe 或者标签 tab )。如果没有指定名称,则一个新的窗口会被打开并且指定的资源会被加载进这个窗口的浏览器上下文中。

//后台传来的下载路径url:https://106.14.15.103:8000/downloadFile/test
//前端核心代码
window.open(url);

很明显这个方法只能将指定路径的资源加载到浏览器里,如果该文件不能被浏览器预览,浏览器就会下载该文件,但是,如果浏览器可以预览该文件呢?是不是这个方法不可以实现?要求下载一个txt文本,用该方法浏览器会直接预览该txt文件。

3.a标签(可以直接下载)

a标签的href属性指定下载文件的路径,需要给a标签添加一个download属性,download指定下载文件保存时的名称。

<a href="https://106.14.15.103:8000/downloadFile/test" download="test.txt">下载</a>

上述三种都是通过加载文件url直接下载,如果后端返回文件流,则需要先转化为url再下载;
另外上述三种方式默认是get方式,如果需要使用post方式且需传参,最好使用第四种方式;


4.文件流下载

1.ajax请求将文件流下载下来
2.将下载的文件流转化为blob数据
3.通过 window.URL.createObjectURL(blob)将blob转化为url
4.通过动态生成a标签 模拟点击事件下载
this.$http({
   url: this.$http.adornUrl(`/strUrl/${id}`),
   method: 'get',
   responseType: 'blob',
   timeout: 1000 * 600
 }).then(res => {
   console.log('res', res)
   if (res.status === 200) {
     const blob = new Blob([res.data], { type: `application/octet-stream` })
     const downloadElement = document.createElement('a')
     const href = window.URL.createObjectURL(blob)
     downloadElement.href = href
     downloadElement.download = `${filename}`
     downloadElement.click()
   } else {
     this.$message.error('下载出错!')
   }
 })

5.iframe

<el-button  size="mini" @click="handleExport(scope.row)">导出</el-button>
//method方法:
handleExport(row) {
  var elemIF = document.createElement('iframe')
  elemIF.src = 'user/downloadExcel?snapshotTime=' + formatDate(new Date(row.snapshotTime), 'yyyy-MM-dd hh:mm') +
                '&category=' + row.category 
  elemIF.style.display = 'none'
  document.body.appendChild(elemIF)
}

在后端返回文件流后,前端可以通过以下几种方式实现文件下载导出: 1. 使用`<a>`标签的`download`属性:可以在前端创建一个`<a>`标签,将后端返回的文件流作为链接的`href`属性值,并设置`download`属性为文件名,这样点击该链接时,浏览器会自动下载文件。 ```html <a href="后端返回的文件流URL" download="文件名">点击下载</a> ``` 2. 使用`window.open()`方法:可以使用JavaScript的`window.open()`方法打开一个新的窗口,并将后端返回的文件流URL作为参数传递给该方法,浏览器会自动下载文件。 ```javascript window.open("后端返回的文件流URL"); ``` 3. 使用`XMLHttpRequest`对象:可以使用JavaScript的`XMLHttpRequest`对象发送GET请求,将后端返回的文件流作为响应内容,然后通过创建`Blob`对象`URL.createObjectURL()`方法将文件流转换为可下载URL,最后使用`<a>`标签的`download`属性进行下载。 ```javascript var xhr = new XMLHttpRequest(); xhr.open("GET", "后端返回的文件流URL", true); xhr.responseType = "blob"; xhr.onload = function() { if (xhr.status === 200) { var blob = xhr.response; var url = URL.createObjectURL(blob); var a = document.createElement("a"); a.href = url; a.download = "文件名"; a.click(); } }; xhr.send();``` 请注意,以上方法中的"后端返回的文件流URL"需要替换为实际的后端返回的文件流URL,"文件名"需要替换为实际的文件名。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值