uniapp小程序上传文件

需求

小程序需要上传用户相册图片或拍摄的照片到后端服务器

uniapp官方处理小程序文件方法

选择文件方法:uni.chooseMedia

uni-app官网uni-app,uniCloud,serverless,uni.chooseVideo(OBJECT),chooseVideo HarmonyOS 兼容性,uni.chooseMedia(OBJECT),uni.saveVideoToPhotosAlbum(OBJECT),saveVideoToPhicon-default.png?t=N7T8https://uniapp.dcloud.net.cn/api/media/video.html#choosemedia

上传文件方法:uni.uploadFile

uni.uploadFile(OBJECT) | uni-app官网uni-app,uniCloud,serverless,uni.uploadFile(OBJECT),uploadFile HarmonyOS 兼容性,参数 HarmonyOS 兼容性,返回值 HarmonyOS 兼容性,UploadTask 的方法,abort(),onProgressUpdateicon-default.png?t=N7T8https://uniapp.dcloud.net.cn/api/request/network-file.html#uploadfile

前端代码

前端项目为vue3类型的uniapp小程序项目

这里封装一个简单的插件来处理图片的选择和上传

<template><view class="flex align-start flex-wrap padding-bottom"><view class="flex flex-direction align-center justify-between margin-left-lg margin-top"v-for="(item,index) in innerFileList" :key="index"><image class="cu-avatar xl radius" mode="scaleToFill" :src="item.fileUrl" @tap="previewImg(item)"></image><text class='text-second' @tap="handleDelete(item)">删除图片</text></view><view class="cu-avatar xl radius margin-left-lg margin-top" @tap="handleChoose"><text class="cuIcon-pic"></text></view></view>
</template><script setup>
import {ref,computed,reactive,onMounted,watch} from 'vue'
import {useStore} from 'vuex'import {toastError,toastMessage} from '@/util/common.js'const props = defineProps({fileList: Array,fileUse: Number,limit: {type: Number,default: 5}})const store = useStore()const emits = defineEmits(['updateFile'])const token = computed(() => store.state.token)const innerFileList = ref([])onMounted(() => {getFileList()})watch(() => props.fileList, (n, o) => {if (!n || !n.length) {innerFileList.value = []} else if (!innerFileList.value.length) {getFileList()} else {if (n.length !== innerFileList.value.length) {getFileList()}}})const getFileList = () => {innerFileList.value = []if (props.fileList && props.fileList.length) {for (let item of props.fileList) {item.fileUrl = getFileUrl(item.fileToken)}innerFileList.value = props.fileList}}const {getFileUrl} = useGetFileUrl()// 删除文件const handleDelete = item => {uni.showModal({title: '确定删除吗?',content: '确定删除该图片吗',success: res => {if (res.confirm) {let index = innerFileList.value.findIndex(x => x.fileUrl === item.fileUrl)innerFileList.value.splice(index, 1)}}})}// 选择文件const handleChoose = () => {if (innerFileList.value.length >= props.limit) {toastError('不能超过' + props.limit + '张')return}// #ifdef MP-WEIXINuni.chooseMedia({count: 1,mediaType: ['image'],fail: error => {console.log('图片选择失败', error)},success: res => {let file = res.tempFiles[0]innerFileList.value.push({id: 0,fileUrl: file.tempFilePath})if (!file) returnhandleUpload(file.tempFilePath, '手机图片')}})// #endif// #ifdef APP uni.chooseImage({count: 1,fail: error => {console.log('图片选择失败', error)},success: res => {let filePath = res.tempFilePaths[0]innerFileList.value.push({id: 0,fileUrl: filePath})if (!filePath) returnhandleUpload(filePath, '手机图片')}})// #endif}const handleUpload = (filePath, name) => {let accessToken = 'Bearer ' + token.valuelet uploadUrl = '我的服务器url'uni.uploadFile({url: uploadUrl,filePath: filePath,name: name,header: {Authorization: accessToken,},fail: error => {console.log('图片上传失败', error)toastError('图片上传失败')},success: uploadRes => {console.log('图片上传成功', uploadRes)if (uploadRes.statusCode === 200) {let data = JSON.parse(uploadRes.data)if (data.data) {let item = innerFileList.value[innerFileList.value.length - 1]item.fileId = data.data.picIditem.fileToken = data.data.picTokenitem.fileUse = props.fileUseemits('updateFile', innerFileList.value)}}}})}// 预览const previewImg = item => {let urls = [item.fileUrl]uni.previewImage({urls: urls})}</script><style></style>

后端代码

后端项目为asp.net6的webapi项目

注意入参为IFormCollection formCollection  和web项目的IFormFile file入参有所区别

[HttpPost("upload_app_sales_order_cert")][Authorize]public async Task<CommonResponse<UploadFileRes>> UploadSalesOrderCertApp(IFormCollection formCollection){var user = GetUser();FormFileCollection formFiles = (FormFileCollection)formCollection.Files;var file = formFiles[0];
//这里换成自己的业务逻辑var res = await _uploadDataService.UploadFileAsync(file, user.UserId, user.DealerId, FileUse.销售单凭证);return new CommonResponse<UploadFileRes>(res);}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/43133.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android:如何绘制View

点击查看Android 如何绘制视图官网 一、简介 Android 框架会在 Activity 获得焦点时请求 Activity 绘制其布局。Android 框架会处理绘制流程&#xff0c;但该 Activity 必须提供其布局层次结构的根节点。 Android 框架会绘制布局的根节点&#xff0c;并测量和绘制布局树。它会…

React@16.x(51)路由v5.x(16)- 手动实现文件目录参考

作为前面几篇文章的参考&#xff1a; 实现 Router实现 Route实现 Switch实现 withRouter实现 Link 和 NavLink 以上。

一.4 处理器读并解释储存在内存中的指令

此刻&#xff0c;hello.c源程序已经被编译系统翻译成了可执行目标文件hello&#xff0c;并被存放在硬盘上。要想在Unix系统上运行该可执行文件&#xff0c;我们将它的文件名输入到称为shell的应用程序中&#xff1a; linux>./hello hello, world linux> shell是一个命令…

深度优先搜索和广度优先搜索 使用场景

深度优先搜索&#xff08;Depth-First Search, DFS&#xff09;和广度优先搜索&#xff08;Breadth-First Search, BFS&#xff09;是图和树结构中常用的遍历算法。两者适用于不同的场景。 深度优先搜索 优点 较低的空间复杂度&#xff08;只需保存当前路径&#xff09;&…

JS实现当前元素的同级元素 以及父元素的同级元素

<!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>实现当前元素的同级元素 以及父元素的同级元素</t…

一.2.(4)放大电路静态工作点的稳定;

1.Rb对Q点及Au的影响 输入特性曲线&#xff1a;Rb减少&#xff0c;IBQ&#xff0c;UBEQ增大 输出特性曲线&#xff1a;ICQ增大&#xff0c;UCEQ减少 AUUO/Ui分子减少&#xff0c;分母增大&#xff0c;但由于分子带负号&#xff0c;所以|Au|减少 2.Rc对Q点及Au的影响 输入特性曲…

用Vue3和Plotly.js绘制交互式3D小提琴图

本文由ScriptEcho平台提供技术支持 项目地址&#xff1a;传送门 Vue 中使用 Plotly.js 创建小提琴图 应用场景介绍 小提琴图是一种统计图&#xff0c;用于显示数据的分布和中心趋势。它结合了箱线图和密度图的特点&#xff0c;可以直观地展示数据的分散性和形状。 代码基本…

【网络协议】OSPF

OSPF OSPF&#xff08;Open Shortest Path First&#xff09;协议是一种广泛使用的动态路由协议&#xff0c;它属于链路状态路由协议&#xff0c;在单一自治系统&#xff08;AS&#xff09;内部工作。以下是关于OSPF协议的详细解析&#xff1a; 一、基本概念 定义&#xff1…

使用Keil 点亮LED灯 F103ZET6

1.新建项目 不截图了 2.startup_stm32f10x_hd.s Keil\Packs\Keil\STM32F1xx_DFP\2.2.0\Device\Source\ARM 搜索startup_stm32f10x_hd.s 复制到项目路径&#xff0c;双击Source Group 1 3.项目文件夹新建stm32f10x.h&#xff0c; 新建文件main.c #include "stm32f10x…

windows sshkeygen 多平台添加配置

文章目录 .ssh目录生成新的ssh配置添加公钥到仓库验证 .ssh目录 windows下一般为&#xff1a;C:\Users\15237.ssh &#xff0c;其中“15237”为当前登录用户 生成新的ssh .ssh目录下打开“Git Bash Here”&#xff08;如果没有&#xff0c;先安装 Git 软件&#xff09; 执行…

android perfetto使用技巧梳理

1 抓取方法 根据不同的配置参数&#xff0c;会显示不同的功能。 比如有的trace文件就无法显示线程状态信息&#xff0c;有的无法显示锁依赖信息等等&#xff0c;要看你的参数&#xff0c;我这个是很全的&#xff0c;基本够了&#xff0c;如果还想添加&#xff0c;可以命令行看…

腾讯发布2024大模型十大最新趋势!

近日&#xff0c;在2024世界人工智能大会上&#xff0c;腾讯正式发布了《2024大模型十大趋势——走进“机器外脑”时代》报告。目前&#xff0c;这一报告正在AI产业界各大社群快速传播。 报告中&#xff0c;腾讯研究院试图通过10个关键性的趋势&#xff0c;去理解全世界范围内正…

移远BC28_opencpu方案_开发环境搭建

OPEN CPU 代码采用的是 Python 脚本写的 scons 自动化构建工具。从构建这个角度说&#xff0c;它与 GNU make 是同一类的工具。它是一种改进&#xff0c;并跨平台的 gnu make 替代工具&#xff0c;其集成功能类似于 autoconf/automake。 这里给出简单安装方式

[软件安装]linux下安装steam

1、下载安装包到linux系统 SteamTools 发行版 - Gitee.com 2、选择对应的版本 3、解压安装包steam &#xff08;1&#xff09;在opt路径下新建一个文件夹 sudo mkdir steam &#xff08;2&#xff09;进入压缩包路径下&#xff0c;打开终端&#xff0c;执行以下代码进行解压…

Docker容器 为MySQL创建新用户和授权

当您需要为 MySQL 数据库创建一个新用户并配置其访问权限时&#xff0c;可以按照以下步骤操作。我将创建一个名为 newuser 的新用户&#xff0c;并为其授予在任何主机上访问所有数据库的权限。 创建新用户和授权步骤&#xff1a; 登录到 MySQL 服务器 首先&#xff0c;使用具有…

python特征相关性可视化分析 - sns.pairplot

seaborn 是一个基于 matplotlib 的 Python 数据可视化库&#xff0c;提供了更高层次的接口来绘制有吸引力的统计图形。pairplot 是 seaborn 中的一个函数&#xff0c;用于绘制数据集中多个变量之间的成对关系图。 基本用法 pairplot 函数可以快速地对数据集中的所有数值变量进…

volatile和static的区别

作用范围和变量类型&#xff1a; static关键字用于创建类级别的变量或方法&#xff0c;所有类的实例共享同一个static变量的副本。它还可以用于方法、初始化块和内部类。相比之下&#xff0c;volatile仅用于声明变量&#xff0c;确保在多线程环境中的可见性&#xff0c;使所有线…

Day1--每日一练

&#x1f341; 个人主页&#xff1a;爱编程的Tom&#x1f4ab; 本篇博文收录专栏&#xff1a;每日一练-算法篇&#x1f449; 目前其它专栏&#xff1a;c系列小游戏 c语言系列--万物的开始_ Java专栏等 &#x1f389; 欢迎 &#x1f44d;点赞✍评论⭐收藏&…

向量动态量化

背景介绍 量化&#xff08;Quantization&#xff09;是向量检索技术中一种常用的优化方法&#xff0c;通过一定程度的精度&#xff08;召回率&#xff09;损失&#xff0c;来换取性能的大幅度提升&#xff0c;以及内存占用&#xff08;索引文件大小&#xff09;大幅度降低。 …

一个parquet-go例子

一个parquet-go例子 使用go读写parquet&#xff0c;使用到了框架github.com/xitongsys/parquet-go 代码: package mainimport ("log""time""github.com/xitongsys/parquet-go-source/local""github.com/xitongsys/parquet-go/parquet&qu…