当前位置: 首页 > news >正文

uniapp+uviewUI 实现上传图片功能up-upload

官网:https://uview-plus.jiangruyi.com/components/upload.html#api

方式一:非自动上传

<!-- * @Descripttion: 图片上传: UploadPicture 非自动上传 --> <template> <up-upload :fileList="fileList" multiple @afterRead="afterRead" @delete="deletePic" :maxCount="2" ></up-upload> </template> <script setup> import { requestPromiseAPI } from '@/help'; import { uploadAPI } from '@/api/common'; const max = ref(2); const fileList = ref([]); // 数据操作后赋值 const setKeyInfo = () => { const urlString = fileList.value.map((item) => item.url).join(', '); }; // 删除图片 const deletePic = (event) => { fileList.value.splice(event.index, 1); setKeyInfo(); }; // 新增图片 const afterRead = (event) => { // 当设置 mutiple 为 true 时, file 为数组格式,否则为对象格式 const files = Array.isArray(event.file) ? event.file : [event.file]; const currentFileListLength = fileList.value.length; // 检查是否超过最大上传数量 if (maxCount.value < files.length + currentFileListLength) { return uni.$u.toast(`最多上传${maxCount.value}张图片`); } // 临时存储新添加的文件(带上传中状态) const newFiles = files.map((file) => ({ ...file, status: 'uploading', message: '上传中', })); // 合并到 fileList(先添加所有文件,再逐个更新状态) fileList.value = [...fileList.value, ...newFiles]; // 遍历上传每个文件 files.forEach(async (formData, index) => { const fileIndex = currentFileListLength + index; // 新文件在 fileList 中的索引 const params = { params: { type: 'VIDEO_IMG', }, formData, }; // 使用通用图片上传接口,如要当前可以调用uploadAPI_MORG const { msg, data, isOK } = await requestPromiseAPI(uploadAPI, params); if (isOK) { fileList.value[fileIndex] = { ...fileList.value[fileIndex], status: 'success', message: '', url: data, }; setKeyInfo(); } else { uni.$u.toast(msg); } }); }; </script>

方式二:自动上传

<!-- * @Descripttion: 图片上传: UploadPicture --> <template> <up-upload autoUpload :autoUploadApi="autoUploadApi" :autoUploadHeader="{ auth: getToken(), }" :fileList="fileList" customAfterAutoUpload @afterAutoUpload="afterAutoUpload" @delete="deletePic" :maxCount="maxCount" ></up-upload> </template> <script setup> import { uploadFileAPI } from '@/help'; import { getToken } from '@/utils'; //直接拿到后端api,组件自动处理参数,无需自主处理 const autoUploadApi = ref(uploadFileAPI()); const fileList = ref([]); const maxCount = ref(2); // 数据操作后赋值 const setKeyInfo = () => { const urlString = fileList.value.map((item) => item.url).join(','); }; // 上传后处理逻辑配合 const afterAutoUpload = (res) => { const jsonStr = res.toString(); // 转换为普通字符串 const { data } = JSON.parse(jsonStr); // 防止赋值不一致,必须multiple是false,除非返回特殊区别的状态,否则multiple是true只能非自动上传处理逻辑 fileList.value.at(-1).url = data; setKeyInfo(); }; // 删除图片 const deletePic = (event) => { fileList.value.splice(event.index, 1); setKeyInfo(); }; </script>
http://www.jsqmd.com/news/801734/

相关文章:

  • 三菱PLC编程:手把手教你用FROM/TO指令读取FX2N-2AD的数据(附经典梯形图逐行解析)
  • Splay Tree 不只是平衡树:解锁区间翻转,实现文艺平衡树(P3165题解)
  • Java算法与进阶语法
  • 2026年浙江电动破碎阀与水泥块料破碎机行业横评选购指南 - 精选优质企业推荐官
  • 如何在Photoshop中解锁AVIF格式支持?3分钟搞定下一代图像处理
  • 如何永久保存微信聊天记录:WeChatMsg开源工具的完整指南
  • MCP协议实战:让AI助手拥有本地项目操作能力
  • 【信息科学与工程学】【金融工程】第十四篇 全行业收入支出流程与数学模型系统01
  • SoC设计挑战与门阵列技术解决方案
  • 东北电力穿线顶管技术要点与吉林合规供应商梳理 - 奔跑123
  • Python轻量级任务编排引擎maestro:开发者友好的工作流自动化实践
  • 搭建内部文档中心:用MkDocs + GitHub Pages优雅呈现
  • 2026南宁名表回收怎么选?5家实测,龙头领跑+口碑之选 - 奢侈品回收测评
  • Mac微信插件终极指南:3个核心功能解决你的微信使用痛点
  • 【信息科学与工程学】【管理科学】第四十三篇 企业治理多因子关联模型体系(利益、收入/支出、法律、权力)——07 多层级收入分配公平性子模块
  • 大语言模型生命周期全链路解析:从架构基石到高效推理
  • 面包板实战:用4个220Ω电阻和Arduino驱动四位共阳数码管,避坑接线与亮度调节
  • 不同测试数据下,该如何选择算法
  • python网上书店系统vue
  • 2026年长沙系统门窗与别墅高端定制阳光房完全选购指南:隔音防水定制方案全解 - 优质企业观察收录
  • 5分钟轻松搞定:KMS智能激活工具完整使用指南
  • 别再到处找安装包了!STM32F103ZET6开发环境搭建(Keil MDK + 正点原子精英板)保姆级教程
  • SPT-AKI存档编辑器:轻松定制你的逃离塔科夫单机版游戏体验
  • 从DLA到DLAseg:可变形卷积如何重塑特征融合与分割网络
  • 揭秘5种高效的虚拟环境检测技术:实战指南
  • 英雄联盟国服免费换肤神器:R3nzSkin完全解锁全皮肤体验
  • Google Meet开启Gemini字幕后CPU飙升300%?资深SRE教你用Chrome Tracing+Gemini Profiling Dashboard精准定位瓶颈
  • STM32H750内存不够用?手把手教你用双外部FLASH实现IAP固件升级(附完整代码)
  • 2026年江苏电动破碎阀与水泥块料破碎机行业深度横评:五大品牌完全对标指南 - 精选优质企业推荐官
  • 不止于Hyper-V:Disk2vhd转换的VHDX镜像如何在VMware和VirtualBox里跑起来?