• vue3上传文件组件方法封装


    说明:该封装适用于将文件生成链接放在腾讯桶,再将链接放在服务器,不适用于直接将文件上传到服务器。也就是适用于将文件链接上传到服务器,不适用于直接将文件上传到服务器

    将文件上传到服务器的方法:

    1.在utils文件夹下新建upload.js文件

    1. import { ElMessage } from 'element-plus'
    2. import axios from 'axios';
    3. // 参数fn是请求后端的接口(上传到桶);file是上传文件的数据,上传组件自带的参数;data是fn接口传递的数据;fileType是文件类型;size是文件大小
    4. export async function upload (fn, file, data, fileType, size) {
    5. // 附件格式
    6. if (fileType) {
    7. const fileCut = file.file.name.substring(file.file.name.lastIndexOf('.') + 1)
    8. if (fileType.indexOf(fileCut.toLowerCase()) === -1) { // 处理后缀名大小写问题
    9. ElMessage.warning(`上传的附件格式只能是 ${fileType.toString()}!`);
    10. return Promise.reject(false)
    11. }
    12. }
    13. // 附件 大小
    14. if (size) {
    15. const isLt2M = file.file.size / 1024 / 1024 < size
    16. if (!isLt2M) {
    17. return ElMessage.warning(`上传的附件大小不能超过 ${size}MB!`)
    18. }
    19. }
    20. let type = getContentType(file.file.name)
    21. let arr = {}
    22. // 使用同步方法返回参数 否则获取返回值时接口还没执行完成
    23. await fn(data).then(res => {
    24. axios.put(res.data.uploadUrl,file.file,{
    25. headers: {
    26. 'Content-Type': type
    27. }
    28. })
    29. arr = res.data
    30. })
    31. return Promise.resolve(arr)
    32. }
    33. function getContentType(filename) {
    34. let fileSuffix = filename.substring(filename.lastIndexOf(".") + 1);
    35. let contentType = 'multipart/form-data'
    36. switch(fileSuffix){
    37. case 'png':
    38. contentType = 'image/png';
    39. break
    40. case 'jpg':
    41. contentType = 'image/jpeg';
    42. break
    43. case 'jpeg':
    44. contentType = 'image/jpeg';
    45. break
    46. case 'gif':
    47. contentType = 'image/gif';
    48. break
    49. case 'pdf':
    50. contentType = 'application/pdf';
    51. break
    52. case 'doc':
    53. contentType = 'application/msword';
    54. break
    55. case 'docx':
    56. contentType = 'application/vnd.openxmlformats-officedocument.wordprocessingml.document';
    57. break
    58. case 'xls':
    59. contentType = 'application/vnd.ms-excel';
    60. break
    61. case 'xlsx':
    62. contentType = 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet';
    63. break
    64. }
    65. return contentType
    66. }

    说明:参数fn是请求后端的接口;file是上传文件的数据,上传组件自带的参数;data是fn接口传递的数据;

    2.页面中使用

    1. <el-upload action="#" list-type="picture-card" :http-request="headImgUpload" :show-file-list="false">
    2. <div style="width: 100%;height: 100%;">
    3. <div v-if="!accountInfBaseVO.avatar" style="position: relative;top: 50%;transform: translateY(-50%);">
    4. <svg-icon icon-class="jia" style="height: 100px;width: 100px;" />
    5. div>
    6. <div v-else style="position: relative;top: 50%;transform: translateY(-50%);">
    7. <svg-icon icon-class="jia" style="height: 100px;width: 100px;" />
    8. div>
    9. div>
    10. el-upload>
    1. import { upload } from '@/utils/upload' // 封装的方法
    2. import { getUpload,accountInfoUpdate} from "@/api/accountinfo";//上传头像接口和修改头像接口
    3. // 修改头像
    4. function headImgUpload(file) {
    5. const fileType = ['jpg', 'png', 'jpeg']
    6. if (file.file.name.length > 200) {
    7. return ElMessage.error("文件名不能超过200字符")
    8. }
    9. // 将文件上传到桶,生成链接
    10. const data = upload(getUpload, file, { fileName: file.file.name, type: 2 }, fileType, 2)
    11. data.then(res => {
    12. if (!res.successUrl) {
    13. return
    14. }
    15. accountInfBaseVO.value.avatar = res.successUrl;
    16. let data = {
    17. nickName: accountInfBaseVO.value.nickName,
    18. avatar: accountInfBaseVO.value.avatar,
    19. industry: personalAuthenticationVO.value?.industry
    20. }
    21. accountInfoUpdate(data).then(res => { // 生成的链接上传到服务器
    22. isImgEdit.value = false;
    23. ElMessage.success("修改成功!")
    24. getAccountInfo();
    25. RealNameRef.value.getAccountInfo();
    26. })
    27. })
    28. }

    说明:整个使用过程中的重点在于标签上属性http-request的使用;方法中重点在于封装方法的调用getUpload(),该封装方法的第一个参数是将文件上传到后端存储的接口,这一步只是上传到了后端数据库,要渲染在页面上就需要请求后端的另一个接口(修改头像接口)。

  • 相关阅读:
    Redis数据类型——list类型数据的扩展操作
    面食有哪些 面食的种类大全
    Python入门教程 | Python 迭代器与生成器
    FFmpeg代码编程获取视频信息
    聊聊测试开发工程师的职责定位问题
    2022年全国最新消防设施操作员(高级消防设施操作员)真题题库及答案
    Python 接口测试之接口关键字封装
    爱奇艺的架构到底有多牛?
    如何在macbook上删除文件?Mac删除文件的多种方法
    Python 自动化(十七)ORM操作
  • 原文地址:https://blog.csdn.net/2202_75509848/article/details/133019262