记录-文件上传和下载-小坑

  1. 文件下载
    1. 通用封装
  1. 文件上传

1. 文件下载

  1. 针对url(http://xxxxxx/a.zip) 的下载
    • window.open(url, ‘_self’) // 是能下载的链接,就直接下载
  1. // 以下代码可以控制台直接跑起来
  2. var data = ['<a id="a"><b id="b">hey!</b></a>']; // data,用数组包裹
  3. var blob = new Blob(data, {type : 'application/octet-stream;charset=utf-8'}); // 生成Blob对象, Blob对象表示一个不可变、原始数据的类文件对象
  4. var url = window.URL.createObjectURL(blob) // 生成一个url:可以指向 File 对象或 Blob 对象。
  5. window.open(url) // 打开url,如果是下载链接则下载
  1. 针对文件流的下载
    接口给到一个文件流的话,其实也可以和上面的方法一样去下载。但是缺点是需要用户自己去手动输入 下载的文件名和格式,否则是没有后缀的文件,会显示打不开
    以下我们用dom的download属性下载

    1. const downFile = (data, filename = '模板.xlsx', headerType = 'application/octet-stream;charset=utf-8') => {
    2. const blob = new Blob([data], { type: headerType }) // 生成Blob对象, Blob对象表示一个不可变、原始数据的类文件对象
    3. const url = window.URL.createObjectURL(blob) // 生成一个url:可以指向 File 对象或 Blob 对象。
    4. const dom = document.createElement('a')
    5. dom.href = url
    6. dom.download = decodeURI(filename) // 用dom的download下载,可以设置默认文件名
    7. dom.style.display = 'none'
    8. document.body.appendChild(dom)
    9. dom.click()
    10. dom.parentNode.removeChild(dom) // 释放内存
    11. window.URL.revokeObjectURL(url) // 释放内存
    12. }

    !!!此处有个坑,需要特别注意:
    文件流是从接口拿的,请求的axios需要配置 responseType !!!
    ```javascript export const get_xxx = (params) => { return axios({ method: ‘get’, url: “/xxxx”, responseType: “blob”, // 拿文件流需要配置这个 params }) }

// axios 内: // responseType 表示服务器响应的数据类型, // 可以是 ‘arraybuffer’, ‘blob’, ‘document’, ‘json’, ‘text’, ‘stream’ responseType: ‘json’, // 默认的

  1. 3. 最终封装
  2. ```javascript
  3. /**
  4. * 方法说明 下载文件, 有2种形式, 1. url (例如: http://xxxxx/a.zip) 2. 文件流, 且需要默认文件名
  5. * @method downFile
  6. * @param{object} url data filename headerType
  7. *
  8. * 使用示例:
  9. * 形式1: downFile({ url: 'http://xxxxx/a.zip' })
  10. * 形式2: downFile({
  11. * data: 'xxx文件流',
  12. * filename: '模板.xlsx', // 可选, 默认'模板.xlsx'
  13. * headerType: 'application/octet-stream;charset=utf-8', // 可选 默认'application/octet-stream;charset=utf-8'
  14. * })
  15. */
  16. export const downFile = function (obj) {
  17. if (obj.url) { // 形式1 url (例如: http://xxxxx/a.zip)
  18. window.open(url)
  19. } else { // 形式2 文件流, 且需要默认文件名
  20. const { data, filename = '模板.xlsx', headerType = 'application/octet-stream;charset=utf-8' } = obj
  21. const blob = new Blob([data], { type: headerType })
  22. const url = window.URL.createObjectURL(blob)
  23. const dom = document.createElement('a')
  24. dom.href = url
  25. dom.download = decodeURI(filename) // 用dom的download下载,可以设置默认文件名
  26. dom.style.display = 'none'
  27. document.body.appendChild(dom)
  28. dom.click()
  29. dom.parentNode.removeChild(dom) // 释放内存
  30. window.URL.revokeObjectURL(url) // 释放内存
  31. }
  32. }

2. 文件上传

先说一下小坑,憋着难受 ( ̄. ̄||)

  1. 如果响应头: Access-Control-Allow-Origin: *
  2. 白名单直接配置了*的话,前端就不能带cookie !!!!
  3. 否则接口会报跨域的错误

接下来继续讲文件上传

  1. 用ui组件 (此处用的iview)
    然后,如果接口需要加参数,则加个 name=”excelFile”
    记录-文件上传和下载-小坑 - 图1 ```html

    点击或拖拽上传文件

注意点:公司内部平台,一般来说,都需要设置请求头 不要加Content-Type: multipart/form-data; ( 文件上传默认会自动适配Content-Type, 千万不要在额外加 ) 其他的请求头需要多少,就自行加上 此处有个坑点 ui组件配置 with-credentials(支持发送 cookie 凭证信息, 默认false,如果要改为true 要小心),这个坑点就是上面写的

  1. 2. 自己写上传
  2. 1. axios上传<br />最好,重新引入axios,因为,项目内的axios可能被封装过,Content-Type 可能已经被动过了,要文件上传能够成功,这个Content-Type不能动,他会自动识别到是文件上传multipart/form-data + 文件标识
  3. ```javascript
  4. import Axios from 'axios'
  5. const upload = (file) => {
  6. // file 是 File对象
  7. const formData = new FormData()
  8. formData.append('excelFile', file) // 接口需要传参excelFile,具体情况具体分析
  9. let res = await Axios.post('http://xxxx/import', formData, {
  10. headers: {
  11. 'Token': xxx,
  12. 'System-Host': xx
  13. }
  14. })
  15. res = res.data
  16. console.log(res)
  17. }
  1. 用fetch上传
    1. const upload = (file) => {
    2. // file是 File 对象
    3. const formData = new FormData()
    4. formData.append('excelFile', file) // 接口需要传参excelFile,具体情况具体分析
    5. let res = await fetch('http://xxxxx/import', {
    6. body: formData,
    7. credentials: 'omit', // 不传cookie
    8. headers: {
    9. 'Token': xxx,
    10. 'System-Host': xx
    11. },
    12. method: 'POST' // *GET, POST, PUT, DELETE, etc.
    13. })
    14. res = await res.json()
    15. console.log(res)
    16. }