当前位置: 首页 > 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…...

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…...

挑战杯推荐项目

“人工智能”创意赛 - 智能艺术创作助手&#xff1a;借助大模型技术&#xff0c;开发能根据用户输入的主题、风格等要求&#xff0c;生成绘画、音乐、文学作品等多种形式艺术创作灵感或初稿的应用&#xff0c;帮助艺术家和创意爱好者激发创意、提高创作效率。 ​ - 个性化梦境…...

Android Wi-Fi 连接失败日志分析

1. Android wifi 关键日志总结 (1) Wi-Fi 断开 (CTRL-EVENT-DISCONNECTED reason3) 日志相关部分&#xff1a; 06-05 10:48:40.987 943 943 I wpa_supplicant: wlan0: CTRL-EVENT-DISCONNECTED bssid44:9b:c1:57:a8:90 reason3 locally_generated1解析&#xff1a; CTR…...

线程与协程

1. 线程与协程 1.1. “函数调用级别”的切换、上下文切换 1. 函数调用级别的切换 “函数调用级别的切换”是指&#xff1a;像函数调用/返回一样轻量地完成任务切换。 举例说明&#xff1a; 当你在程序中写一个函数调用&#xff1a; funcA() 然后 funcA 执行完后返回&…...

【C++从零实现Json-Rpc框架】第六弹 —— 服务端模块划分

一、项目背景回顾 前五弹完成了Json-Rpc协议解析、请求处理、客户端调用等基础模块搭建。 本弹重点聚焦于服务端的模块划分与架构设计&#xff0c;提升代码结构的可维护性与扩展性。 二、服务端模块设计目标 高内聚低耦合&#xff1a;各模块职责清晰&#xff0c;便于独立开发…...

论文笔记——相干体技术在裂缝预测中的应用研究

目录 相关地震知识补充地震数据的认识地震几何属性 相干体算法定义基本原理第一代相干体技术&#xff1a;基于互相关的相干体技术&#xff08;Correlation&#xff09;第二代相干体技术&#xff1a;基于相似的相干体技术&#xff08;Semblance&#xff09;基于多道相似的相干体…...

R语言速释制剂QBD解决方案之三

本文是《Quality by Design for ANDAs: An Example for Immediate-Release Dosage Forms》第一个处方的R语言解决方案。 第一个处方研究评估原料药粒径分布、MCC/Lactose比例、崩解剂用量对制剂CQAs的影响。 第二处方研究用于理解颗粒外加硬脂酸镁和滑石粉对片剂质量和可生产…...

Linux nano命令的基本使用

参考资料 GNU nanoを使いこなすnano基础 目录 一. 简介二. 文件打开2.1 普通方式打开文件2.2 只读方式打开文件 三. 文件查看3.1 打开文件时&#xff0c;显示行号3.2 翻页查看 四. 文件编辑4.1 Ctrl K 复制 和 Ctrl U 粘贴4.2 Alt/Esc U 撤回 五. 文件保存与退出5.1 Ctrl …...

python爬虫——气象数据爬取

一、导入库与全局配置 python 运行 import json import datetime import time import requests from sqlalchemy import create_engine import csv import pandas as pd作用&#xff1a; 引入数据解析、网络请求、时间处理、数据库操作等所需库。requests&#xff1a;发送 …...

LOOI机器人的技术实现解析:从手势识别到边缘检测

LOOI机器人作为一款创新的AI硬件产品&#xff0c;通过将智能手机转变为具有情感交互能力的桌面机器人&#xff0c;展示了前沿AI技术与传统硬件设计的完美结合。作为AI与玩具领域的专家&#xff0c;我将全面解析LOOI的技术实现架构&#xff0c;特别是其手势识别、物体识别和环境…...