前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >前端vue 封装上传文件和下载文件的方法 导入方法直接使用

前端vue 封装上传文件和下载文件的方法 导入方法直接使用

作者头像
江咏之
发布2022-06-17 15:18:30
2.7K0
发布2022-06-17 15:18:30
举报
文章被收录于专栏:技术社区技术社区

目录标题

1、上传文件

upload.js

代码语言:javascript
复制
import axios from 'axios'
import { Message } from "element-ui";

//  * 封装上传文件的post方法
//  * @param url
//  * @param data
//  * @returns {Promise}

// 接口域名地址
// let baseURL = process.env.VUE_APP_API_BASE_URL
let baseURL = 'https://jiangsihan.cn/'

// 导出方法
export function uploads(url, file) {
    return uploadData(url, file)
}


function uploadData(url, file) {
    // 创建 FormData 对象
    let formData = new FormData();
    // 通过 append() 方法来追加数据
    formData.append("file", file)
    return new Promise((resolve, reject) => {
        axios.post(baseURL + url, formData, {
            headers: {
                'Content-Type': 'multipart/form-data',
                'X-Access-Token': localStorage.getItem('token'),
            }
        }).then(response => {
            resolve(response)
        }).catch(error => {
        	// 错误响应处理
            if (error.response) {
                // 对响应错误做点什么
                switch (error.response.status) {
                    case 403:
                        Message({ message: '拒绝访问', type: 'error' });
                        break
                    case 500:
                        Message({ message: '很抱歉,登录已过期,请重新登录', type: 'error' });
                        localStorage.clear();
                        sessionStorage.clear()
                        setTimeout(() => {
                            window.location.reload()
                        }, 1000)
                        break
                    case 404:
                        Message({ message: '很抱歉,资源未找到!', type: 'error' });
                        break
                    case 405:
                        Message({ message: '请求方式错误!', type: 'error' });
                        break
                    case 504:
                        Message({ message: '网络超时!', type: 'error' });
                        break
                    case 401:
                        Message({ message: '未授权,请重新登录!', type: 'error' });
                        localStorage.clear();
                        sessionStorage.clear()
                        setTimeout(() => {
                            window.location.reload()
                        }, 1000)
                        break
                    default:
                        Message({ message: data.message, type: 'error' })
                        break
                }
            }
            reject(error)
        })
    })
}

导入:

代码语言:javascript
复制
import { uploads } from '../../utils/upload';

使用:

代码语言:javascript
复制
let url = '接口地址后缀'
// file file对象格式 详细见下方
uploads(url, file).then(res => {
    if (res.data.errCode == 0) {
        Message({ type: 'success', message: '上传成功', duration: 1000 })
        resolve(res)
    }
    resolve(res)
}).catch(err => {
    reject(err)
});

补充说明: 目前各大UI库都有upload上传文件的组件,内置方法就含有file对象,拿到后传入即可。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2、下载文件

download.js

代码语言:javascript
复制
// 文件下载

// let baseURL = process.env.VUE_APP_API_BASE_URL  //服务器地址
let baseURL = 'https://jiangsihan.cn/'

//通过文件下载url拿到对应的blob对象
function getBlob(url) {
  return new Promise(resolve => {
    const xhr = new XMLHttpRequest()
    xhr.open('GET', url, true)
    xhr.responseType = 'blob'
    xhr.onload = () => {
      if (xhr.status === 200) {
        resolve(xhr.response)
      }
    }

    xhr.send()
  })
}
//下载文件   js模拟点击a标签进行下载
function saveAs(blob, filename) {
  var link = document.createElement('a')
  link.href = window.URL.createObjectURL(blob)
  link.download = filename
  link.click()
}


// url 文件地址后缀  fileName文件名称
export function downloadEvt(url, fileName) {  //导出
  let fileUrl = baseURL + url
  getBlob(fileUrl).then(blob => {
    saveAs(blob, fileName)
  })
}

/**
      * download的属性是HTML5新增的属性
      * href属性的地址必须是非跨域的地址,如果引用的是第三方的网站或者说是前后端分离的项目(调用后台的接口),这时download就会不起作用。
      * 此时,如果是下载浏览器无法解析的文件,例如.exe,.xlsx..那么浏览器会自动下载,但是如果使用浏览器可以解析的文件,比如.txt,.png,.pdf....浏览器就会采取预览模式
      * 所以,对于.txt,.png,.pdf等的预览功能我们就可以直接不设置download属性(前提是后端响应头的Content-Type: application/octet-stream,如果为application/pdf浏览器则会判断文件为 pdf ,自动执行预览的策略)
*/

导入:

代码语言:javascript
复制
import { downloadEvt } from "@/utils/download";

使用:

代码语言:javascript
复制
downloadEvt(url, fileName);
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-05-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 目录标题
  • 1、上传文件
  • 2、下载文件
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档