zoukankan      html  css  js  c++  java
  • 前端文件下载的几种方式

    一、直接下载

    针对一些浏览器无法识别的文件格式。可以直接在地址栏上出入URL即可触发浏览器的下载功能。

    同类的还有window.location.href、window.open

    • 地址栏输入文件URL
    • window.location.href = URL
    • window.open(URL)

    二、直接下载(使用a标签download属性)

    直接下载仅使用的浏览器无法识别的文件。如果是浏览器支持的文件格式(如:html、jpg、png)等。则不会触发文件下载,而是被浏览器直接触发解析展示。

    针对这种情况,我们可以使用a标签的download属性,可以设置文件名。

    写法如下:

    <a href="/images/download.jpg" download="myFileName">

    开发中,我们遇到的还有一部分场景是js直接触发下载,也是相同的做法,我们可以手动写一个a标签。appen到body里边,触发下载之后,将其remove

    示例如下(生产环境注意各浏览器事件的兼容性写法):


    const download = (filename, link) => {
        let DownloadLink = document.createElement('a'); 
        DownloadLink.style = 'display: none'; // 创建一个隐藏的a标签
        DownloadLink.download = filename;
        DownloadLink.href = link;
        document.body.appendChild(DownloadLink);
        DownloadLink.click(); // 触发a标签的click事件
        document.body.removeChild(DownloadLink);
    }

    三、直接下载(后端兼容处理attachment)

    有很多场景。有些浏览器可识别的文件格式,我们还是需要直接下载的情况(如:用户直接分享的下载pdf、txt;很多浏览器也是支持展示的)。

    这种情况下,我们需要声明一下文件的header的 Content-Disposition信息。告诉浏览器,该链接为下载附件链接,并且可以声明文件名(方式二也可以下载该类型文件,不过文件名会以header设置的文件名优先)。

    写法如下:

    Content-Disposition: attachment; filename="filename.xls" 

    同类的方法还有将文件作为outstream返回

    四、鉴权下载

    在部分场景中,有一些文件,需要用户登录之后根据权限来开放下载(报表等)。

    此时,我们需要将本地的用户信息传给服务端。常用的方式如:在header增加token。

    这里我们需要使用XmlHttpRequest来想后台发起请求。并带上header信息,获取到文件数据之后,在使用下载方法。

    axios示例如下:

    axios({
        method:'get',
        url: '/download/file.doc'
        responseType: 'blob',
        headers: {
            Authorization: '123456'
        }
    }).then(res => {
        let fileUrl = window.URL.createObjectURL(res.data)
        iTools.download('filename',fileUrl) // 方法二使用到的a标签download方式。
        window.URL.revokeObjectURL(fileUrl)
    })



  • 相关阅读:
    vue scrollTop的使用方法
    常见简体繁体转换
    远程桌面发生身份验证错误,要求的函数不受支持
    发布版找不到字体,控制台会报错问题处理
    sql进阶-自增字段的数据修改
    sql序列(6)游标
    sql序列(1)新建文件夹、建库
    sql进阶-触发器的实现
    sql进阶-@@rowcount详解
    单条数据横向滚动
  • 原文地址:https://www.cnblogs.com/webljl/p/14029995.html
Copyright © 2011-2022 走看看