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

uniapp--点击上传图片到oss再保存数据给后端接口

项目采用uniapp与uview2.0组件库

--1.0的也可以参考一下,大差不差

一、项目要求与样式图

点击上传n张图片到oss,然后点击提交给后端

二、思路

1、打开上传按钮,弹出框内出现上传图片和提交按钮

2、点击上传图片区域,打开本地图片或者调用相机。上传到oss拿到返回的图片url和本地的url地址。可以进行预览删除。再点击提交,将选取好的图片地址发送给后端就ok了

一点特别注意,上传接口的方法一定要是POST,问就是小程序规定

三、代码区域

<view><u-upload :fileList="fileList1" multiple @afterRead="afterRead1" @delete="deletePic1" name="1" :maxCount="3" width="175" height="175" ></u-upload>//相关参数与公式去看view2的官方文档我就不一一简绍了<view><button class="Upstatebtn" type="default" @click="UpdateStatus">提交</button></view>
</view>//data参数
//fileList1: [], //上传图片接受数组
//img1: [], //当前图片数组
因为使用方便,就直接复制的官网案例

关键代码在添加图片后上传的两个数组处理和本地地址还有在线图片地址

            /*** @func 删除图片* */deletePic1(event) {this[`fileList${event.name}`].splice(event.index, 1)var arry = []this.fileList1.filter((v, i) => {arry.push(v.url)})this.img1 = arryconsole.log(this.img1, "1");},/*** @func 新增图片上传  读取后的处理函数* */async afterRead1(event) {// 当设置 mutiple 为 true 时, file 为数组格式,否则为对象格式let lists = [].concat(event.file)console.log('list',lists);let fileListLen = this[`fileList${event.name}`].lengthlists.map((item) => {this[`fileList${event.name}`].push({...item,status: 'uploading',message: '上传中'})})for (let i = 0; i < lists.length; i++) {const result = await this.uploadFilePromise1(lists[i].url)console.log('result是',result);let item = this[`fileList${event.name}`][fileListLen]this[`fileList${event.name}`].splice(fileListLen, 1, Object.assign(item, {status: 'success',message: '',url: result[0]}))fileListLen++}var arry = []this.fileList1.filter((v, i) => {console.log('每一个v是什么',v);arry.push(v.url)})this.img1 = arryconsole.log(this.img1, "1");},/*** @func 上传图片到oss,只提供files,后端完成上传* */uploadFilePromise1(url) {return new Promise((resolve, reject) => {let a = uni.uploadFile({url: '',//后端接口地址,后端解决了oss相关密钥获取filePath: url,name: 'files',success: (res) => {console.log(res.data);
//这里使用JSON.parse是数据返回的问题需要进行转换,官网是不需要进行转换的,未了配合提交接口上传一个oss返回的图片列表数据console.log(JSON.parse(res.data));setTimeout(() => {resolve(JSON.parse(res.data).data) //服务器返回图片带域名//服务器返回图片不带域名需要自己拼接域名 否则预览图片无法实现// resolve('服务器域名' + JSON.parse(res.data).data)}, 1000)}});})},/*** @func 上传图片地址给后台端修改状态* */UpdateStatus() {let params = {id: this.Upid,fileList: this.img1}if (this.img1.length > 0) {//后端需要的数据格式,因为我自己循环时候做了调整不要要这个方法了。//后端要什么格式数据自己商定// params.fileList = this.img1.reduce((arr, cur) => arr.concat((cur), []))GetBudgetUpdate(params).then(res => {if (res == true) {//上传成功后清空params数据,关闭弹框,刷新列表,提示成功this.img1 = []this.taskList = []this.page = 1this.getBudgetList()this.showUp = falseuni.showToast({title: `上传成功`,icon: 'none',duration: 2000,})}})} else {uni.showToast({title: `至少需要上传一张交付物图片`,icon: 'none',duration: 2000})}},/*** @func 上传图片取消,弹框关闭* */closePup(){this.showUp=falsethis.img1=[]this.fileList1=[]this.Upid=''},

四、遇到的问题和处理

第一次使用时候遇到一个问题是点击预览图片失败了,因为我点击图片传递调用uview组件源码方法所传递的值类型不一样    url: result[0]

这一行代码卡了我这个菜鸡2天,我一直认为数据格式没问题,直接修改了下方的源码判断,,本来是url: result。直接添加了数组里的数组,然后传值给后端img1数组时候

// params.fileList = this.img1.reduce((arr, cur) => arr.concat((cur), []))

const a = [ ["1"],["2"],["3"],["4"] ]
//变成
const b =["1","2","3","4"]const b = a .reduce((arr, cur) => arr.concat((cur), []));

嵌套数组合并回去了


 

for (let i = 0; i < lists.length; i++) {const result = await this.uploadFilePromise1(lists[i].url)console.log('result是',result);let item = this[`fileList${event.name}`][fileListLen]this[`fileList${event.name}`].splice(fileListLen, 1, Object.assign(item, {status: 'success',message: '',url: result[0]}))fileListLen++}

 uni.PreviewImage方法需要的是这样的数据格式,拿里面的url地址或者thumb地址

		// 预览图片onPreviewImage(item) {if (!item.isImage || !this.previewFullImage) returnuni.previewImage({// 先filter找出为图片的item,再返回filter结果中的图片urlurls: this.lists.filter((item) => this.accept === 'image' || uni.$u.test.image(item.url || item.thumb)).map((item) => item.url || item.thumb),current: item.url || item.thumb,// urls: this.lists.filter((item) => this.accept === 'image' || uni.$u.test.image(item.thumb || item.url)).map((item) => item.thumb || item.url),current: item.thumb || item.url,fail() {uni.$u.toast('预览图片失败')},});},

五--感谢  小李小李,知书达理的思路与写法

借鉴的这个文章

uniapp利用uview2.0中的uploadFile组件实现多张图片的增删预览上传功能-CSDN博客

相关文章:

uniapp--点击上传图片到oss再保存数据给后端接口

项目采用uniapp与uview2.0组件库 --1.0的也可以参考一下&#xff0c;大差不差 一、项目要求与样式图 点击上传n张图片到oss&#xff0c;然后点击提交给后端 二、思路 1、打开上传按钮&#xff0c;弹出框内出现上传图片和提交按钮 2、点击上传图片区域&#xff0c;打开本地图…...

创建Secret(使用kubectl)

创建Secret&#xff08;使用kubectl&#xff09; 假设某个 Pod 需要访问数据库。在您执行 kubectl 命令所在机器的当前目录&#xff0c;创建文件 ./username.txt 文件和 ./password.txt 暂存数据库的用户名和密码&#xff0c;后续我们根据这两个文件配置 kubernetes secrets。…...

Notepad++正则查询替换操作

Notepad编辑器查找功能非常强大&#xff0c;本处记录一些实战中常用到复杂查询替换操作。 注意&#xff1a;如果是重要文件&#xff0c;替换操作前最好备份&#xff1b;当前一个操作后也可以用ctrlz恢复。 查找重复行 用查找(ctrlf)功能&#xff0c;用正则表达式模式匹配。 查…...

Hive特殊函数的使用

Hive特殊函数的使用 with ascastget_json_objectunix_timestampfrom_unixtime with as 在Hive中&#xff0c;WITH AS是一种子查询的用法&#xff0c;用于在查询的开头定义一个临时表达式。它的语法结构如下: WITH [表达式名称] AS (子查询表达式 )在这个结构中&#xff0c;[表…...

Unity Spine 指定导入新Spine动画的默认材质

指定导入新Spine动画的默认材质 找到Spine的Editor导入配置如何修改方法一: 你可以通过脚本 去修改Assets/Editor/SpineSettings.asset文件方法二&#xff1a;通过面板手动设置 找到Spine的Editor导入配置 通常在 Assets/Editor/SpineSettings.asset 配置文件对应着 Edit/Prefe…...

lvs负载均衡集群

目录 一、集群&#xff1a; 1、集群的目的&#xff1a; 2、集群的类型&#xff1a; 3、集群的可靠性指标&#xff1a; 4、设计集群时需要考虑的原则&#xff1a; 二、lvs集群&#xff1a; 1、lvs集群中的术语&#xff1a; 2、lvs访问的大致流程&#xff1a; 三、lvs的…...

MySQL---表的增查改删(CRUD基础)

文章目录 什么是CRUD&#xff1f;新增&#xff08;Create&#xff09;单行数据 全列插入多行数据 指定列插入 查询&#xff08;Retrieve&#xff09;全列查询指定列查询查询字段为表达式起别名查询去重查询排序查询条件查询分页查询 修改&#xff08;Update&#xff09;删除&…...

听GPT 讲Rust源代码--library/std(2)

File: rust/library/std/src/sys_common/wtf8.rs 在Rust源代码中&#xff0c;rust/library/std/src/sys_common/wtf8.rs这个文件的作用是实现了UTF-8编码和宽字符编码之间的转换&#xff0c;以及提供了一些处理和操作UTF-8编码的工具函数。 下面对这几个结构体进行一一介绍&…...

力扣第1005题 K 次取反后最大化的数组和 c++ 贪心 双思维

题目 1005. K 次取反后最大化的数组和 简单 相关标签 贪心 数组 排序 给你一个整数数组 nums 和一个整数 k &#xff0c;按以下方法修改该数组&#xff1a; 选择某个下标 i 并将 nums[i] 替换为 -nums[i] 。 重复这个过程恰好 k 次。可以多次选择同一个下标 i 。 以…...

Swoole 4.8版本的安装

1、从github拉取安装包 Release v4.8.13 swoole/swoole-src GitHub 2、解压压缩包 tar -zxvf ./v4.8.13.tar.gzcd ./swoole-src-4.8.13 3、执行安装命令 phpize && \ ./configure && \ make && sudo make install 4、检查swoole模块是否安装完成…...

ChatGPT和Copilot协助Vue火速搭建博客网站

AI 对于开发人员的核心价值 网上会看到很多 AI 的应用介绍或者教程 使用 AI 聊天&#xff0c;咨询问题 —— 代替搜索引擎使用 AI 写各种的电商文案&#xff08;淘宝、小红书&#xff09;使用 AI 做一个聊天机器人 —— 这最多算猎奇、业余爱好、或者搞个套壳产品来收费 以上…...

javaEE -8(9000字详解网络编程)

一&#xff1a;网络编程基础 1.1 网络资源 所谓的网络资源&#xff0c;其实就是在网络中可以获取的各种数据资源&#xff0c;而所有的网络资源&#xff0c;都是通过网络编程来进行数据传输的。 用户在浏览器中&#xff0c;打开在线视频网站&#xff0c;如优酷看视频&#xff…...

FPGA从入门到精通(二十)SignalTapII

这一篇将介绍SignalTapII。 之前的工程我们是做仿真&#xff0c;设置激励&#xff0c;观察输出波形去判断代码没有问题&#xff0c;但事实上我们真实的需求是综合后的代码下载到FPGA芯片中能够符合预期。 其中可能出现问题的原因有&#xff1a; 1、我们是写testbench设置激励…...

RHCE---shell 条件测试

文章目录 目录 文章目录 前言 一.条件测试 概述&#xff1a; 文件测试 整数测试&#xff1a; 总结 前言 当我们完成某一命令的编写时&#xff0c;除了观察输出的内容&#xff0c;我们又如何得知命令是否执行成功呢&#xff1f; 这里&#xff0c;我们需要用到条件测试 一.条…...

Linux下QT打开文件选择对话框时,程序报错退出

系统&#xff1a;Ubuntu QString fileName QFileDialog::getOpenFileName(this, "open", "./", "document Files (*.pdf)"); 调用该语句弹出文件对话框时&#xff0c;程序崩溃退出 错误提示&#xff1a; (Widget:5272): Gtk-WARNING **: 14…...

PyTorch中的intrusive_ptr

PyTorch中的intrusive_ptr 前言 intrusive_ptr與unique_ptr&#xff0c;shared_ptr等一樣&#xff0c;都是smart pointer。但是intrusive_ptr比較特別&#xff0c;它所指向的物件類型必須繼承自intrusive_ptr_target&#xff0c;而intrusive_ptr_target必須實現引用計數相關的…...

webrtc-stream编译报错记录

磁盘空间不足错误 错误信息 677.2 fatal: cannot create directory at blink/web_tests/external/wpt: No space left on device说明&#xff1a;这个错误是由于本地在配置docker资源时所给磁盘空间太小导致&#xff0c;直接根据镜像大小合理分配资源大小即可 pushd和popd执…...

什么是Docker CLI

Docker CLI&#xff08;命令行界面&#xff09;是一个工具&#xff0c;允许用户通过命令行或终端与Docker进行交互。Docker是一个开源平台&#xff0c;用于开发、运送和运行应用程序。Docker使用容器化技术来打包应用程序及其依赖项&#xff0c;以确保在不同环境中的一致性和隔…...

Java项目_家庭记账(简易版)

文章目录 简介代码实现 简介 该项目主要用来练习&#xff0c;Java的变量&#xff0c;运算符&#xff0c;分支结构和循环结构的知识点。 程序界面如下&#xff1a; 登记收入 登记支出 收支明细 程序退出 代码实现 package project;import java.util.Scanner;import sta…...

vscode json文件添加注释报错

在vscode中创建json文件&#xff0c;想要注释一波时&#xff0c;发现报了个错&#xff1a;Comments are not permitted in JSON. (521)&#xff0c;意思是JSON中不允许注释 以下为解决方法&#xff1a; 在vscode的右下角中找到这个&#xff0c;点击 在出现的弹窗中输入json wit…...

基于大模型的 UI 自动化系统

基于大模型的 UI 自动化系统 下面是一个完整的 Python 系统,利用大模型实现智能 UI 自动化,结合计算机视觉和自然语言处理技术,实现"看屏操作"的能力。 系统架构设计 #mermaid-svg-2gn2GRvh5WCP2ktF {font-family:"trebuchet ms",verdana,arial,sans-…...

页面渲染流程与性能优化

页面渲染流程与性能优化详解&#xff08;完整版&#xff09; 一、现代浏览器渲染流程&#xff08;详细说明&#xff09; 1. 构建DOM树 浏览器接收到HTML文档后&#xff0c;会逐步解析并构建DOM&#xff08;Document Object Model&#xff09;树。具体过程如下&#xff1a; (…...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院查看报告小程序

一、开发环境准备 ​​工具安装​​&#xff1a; 下载安装DevEco Studio 4.0&#xff08;支持HarmonyOS 5&#xff09;配置HarmonyOS SDK 5.0确保Node.js版本≥14 ​​项目初始化​​&#xff1a; ohpm init harmony/hospital-report-app 二、核心功能模块实现 1. 报告列表…...

SpringBoot+uniapp 的 Champion 俱乐部微信小程序设计与实现,论文初版实现

摘要 本论文旨在设计并实现基于 SpringBoot 和 uniapp 的 Champion 俱乐部微信小程序&#xff0c;以满足俱乐部线上活动推广、会员管理、社交互动等需求。通过 SpringBoot 搭建后端服务&#xff0c;提供稳定高效的数据处理与业务逻辑支持&#xff1b;利用 uniapp 实现跨平台前…...

【JavaWeb】Docker项目部署

引言 之前学习了Linux操作系统的常见命令&#xff0c;在Linux上安装软件&#xff0c;以及如何在Linux上部署一个单体项目&#xff0c;大多数同学都会有相同的感受&#xff0c;那就是麻烦。 核心体现在三点&#xff1a; 命令太多了&#xff0c;记不住 软件安装包名字复杂&…...

CMake控制VS2022项目文件分组

我们可以通过 CMake 控制源文件的组织结构,使它们在 VS 解决方案资源管理器中以“组”(Filter)的形式进行分类展示。 🎯 目标 通过 CMake 脚本将 .cpp、.h 等源文件分组显示在 Visual Studio 2022 的解决方案资源管理器中。 ✅ 支持的方法汇总(共4种) 方法描述是否推荐…...

Android第十三次面试总结(四大 组件基础)

Activity生命周期和四大启动模式详解 一、Activity 生命周期 Activity 的生命周期由一系列回调方法组成&#xff0c;用于管理其创建、可见性、焦点和销毁过程。以下是核心方法及其调用时机&#xff1a; ​onCreate()​​ ​调用时机​&#xff1a;Activity 首次创建时调用。​…...

NPOI Excel用OLE对象的形式插入文件附件以及插入图片

static void Main(string[] args) {XlsWithObjData();Console.WriteLine("输出完成"); }static void XlsWithObjData() {// 创建工作簿和单元格,只有HSSFWorkbook,XSSFWorkbook不可以HSSFWorkbook workbook new HSSFWorkbook();HSSFSheet sheet (HSSFSheet)workboo…...

Linux部署私有文件管理系统MinIO

最近需要用到一个文件管理服务&#xff0c;但是又不想花钱&#xff0c;所以就想着自己搭建一个&#xff0c;刚好我们用的一个开源框架已经集成了MinIO&#xff0c;所以就选了这个 我这边对文件服务性能要求不是太高&#xff0c;单机版就可以 安装非常简单&#xff0c;几个命令就…...

【iOS】 Block再学习

iOS Block再学习 文章目录 iOS Block再学习前言Block的三种类型__ NSGlobalBlock____ NSMallocBlock____ NSStackBlock__小结 Block底层分析Block的结构捕获自由变量捕获全局(静态)变量捕获静态变量__block修饰符forwarding指针 Block的copy时机block作为函数返回值将block赋给…...