• Vue3中通过 input 标签 发送文件/图片给后端


    一;设置 input 标签 

    type="file" ref="fileInput" @change="handleFileChange"/>

    1.将 input 标签的 type 属性设置为 file 。

    使用 type="file" 的  元素使得用户可以选择一个或多个元素以提交表单的方式上传到服务器上,或者通过 Javascript 的 File API 对文件进行操作。

    2.绑定 ref 绑定并获取该标签的DOM节点。

    type="file" 的  元素身上存在一个 files 属性,其中包含了所有已选择的文件,其值是一个伪数组。

    3.绑定事件,处理文件/图片上传的后续逻辑。

    二;通过 FormData 实例对象处理 二进制 文件/图片(以下代码展示上传一张图片)。

    1. // 上传之前要处理一下文件 因为文件是二进制的,要利用 FormData 实例对象进行处理
    2. const formData = new FormData();
    3. // append方法把文件添加到 FormData实例对象中 第一个参数:文件名 第二个参数:要上传的文件
    4. formData.append("smfile", files[0]);

    三;获取 input 节点的 files 属性以及上传文件/图片的业务逻辑与请求发送都放在了 input 事件回调函数中进行。

    由于是发送二进制数据,所以发送请求时头部字段 Content - type 要设置成 multipart / form-data

    1. // input 发生改变时触发的回调函数 --- 验证上传的文件是否合法,然后处理文件并发送请求
    2. const handleFileChange = (e: Event) => {
    3. const currentTarget = e.target as HTMLInputElement;
    4. if (currentTarget.files) {
    5. // 将input身上的files对象转换为数组类型
    6. const files = Array.from(currentTarget.files);
    7. // 如果有上传限制,则对文件进行判断
    8. if (props.beforeUpload) {
    9. // 调用判断文件是否合法的函数---由父组件自定义设置
    10. const result = props.beforeUpload(files[0]);
    11. // 如果不合法就直接返回出去
    12. if (!result) return;
    13. }
    14. // 上传的文件符合要求
    15. // 上传成功之前,把上传文件状态改为 loading
    16. fileStatus.value = "loading";
    17. // 上传之前要处理一下文件 因为文件是二进制的,要利用 FormData 实例对象进行处理
    18. const formData = new FormData();
    19. // append方法把文件添加到 FormData实例对象中 第一个参数:文件名 第二个参数:要上传的文件
    20. formData.append("smfile", files[0]);
    21. // 发送异步请求上传文件
    22. // 因为发送的二进制格式文件 所以要额外设置请求头
    23. axios
    24. .post('yes/api/v2/upload', formData, {
    25. headers: {
    26. "Content-Type": "multipart/form-data",
    27. "Authorization":"CiKs2eatBnpdzNJ58T",
    28. },
    29. })
    30. .then((res) => {
    31. // 图片上传成功
    32. if(res.data.code == 'success') {
    33. // 存储成功的返回结果
    34. uploadedData.value = res.data.data.url;
    35. }else {
    36. uploadedData.value = res.data.images;
    37. }
    38. // 请求发送成功 修改上传文件状态
    39. fileStatus.value = "success";
    40. // 把获取到的图片url传给父组件
    41. context.emit('getImageUrl',uploadedData.value);
    42. })
    43. .catch((e) => {
    44. console.log('图床上传',e);
    45. fileStatus.value = "error";
    46. })
    47. .finally(() => {
    48. if (fileInput.value) {
    49. fileInput.value.value = "";
    50. }
    51. });
    52. }
    53. };

  • 相关阅读:
    【Java面试】线程状态,BLOCKED和WAITING有什么区别
    SpringBoot【集成 jasypt】实现配置信息自定义加解密(自定义的属性探测和密码解析器)
    Python标准库分享之文件管理 (部分os包,shutil包)
    实战!接口优化的18种方案
    【MySQL】——数据库设计概述与需求分析
    5G投资下降,遥遥领先的主流5G或被运营商抛弃,“假5G”更获青睐
    计算机基础-了解软硬件-00:文章内容规划、了解软件和硬件的区别
    java图形验证码到底是怎么生成的?
    防脱发、再生发
    FFmpeg开发笔记(十九)FFmpeg开启两个线程分别解码音视频
  • 原文地址:https://blog.csdn.net/qq_59181609/article/details/126320437