uniapp小程序上传文件

news2024/11/15 10:35:18

需求

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

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-WEIXIN
		uni.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) return
				handleUpload(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) return
				handleUpload(filePath, '手机图片')
			}
		})
		// #endif
	}
	const handleUpload = (filePath, name) => {
		let accessToken = 'Bearer ' + token.value
		let 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.picId
						item.fileToken = data.data.picToken
						item.fileUse = props.fileUse
						emits('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.coloradmin.cn/o/1909601.html

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

相关文章

【北京迅为】《i.MX8MM嵌入式Linux开发指南》-第一篇 嵌入式Linux入门篇-第十三章 Linux连接档

i.MX8MM处理器采用了先进的14LPCFinFET工艺&#xff0c;提供更快的速度和更高的电源效率;四核Cortex-A53&#xff0c;单核Cortex-M4&#xff0c;多达五个内核 &#xff0c;主频高达1.8GHz&#xff0c;2G DDR4内存、8G EMMC存储。千兆工业级以太网、MIPI-DSI、USB HOST、WIFI/BT…

【C++报错已解决】Invalid Use of ‘this’ Pointer

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 文章目录 引言 一、问题描述1.1 报错示例1.2 报错分析1.3 解决思路 二、解决方法2.1 方法一&#xff1a;修正‘this’指针使用2…

首席数据官CDO,提升城市数字治理能力

随着数字技术的飞速发展&#xff0c;首席数据官(CDO)的角色越来越受到各城市的重视。 不仅企业和机构&#xff0c;城市本身也是巨大的数据生成者。 它们拥有丰富的政府、社会和经济数据资源&#xff0c;这些数据涵盖了城市治理、公共服服务和产业进展等多个方面。 利用这些数…

pytorch- RNN循环神经网络

目录 1. why RNN2. RNN3. pytorch RNN layer3.1 基本单元3.2 nn.RNN3.2.1 函数说明3.2.2 单层pytorch实现3.2.3 多层pytorch实现 3.3 nn.RNNCell3.3.1 函数说明3.3.2 单层pytorch实现3.3.3 多层pytorch实现 4.完整代码 1. why RNN 以淘宝的评论为例&#xff0c;判断评论是正面…

登录谷歌时系统提示“找不到您的Google账号”,原因通常有5个

时不时有朋友问我&#xff0c;说他明明后了谷歌账号&#xff0c;但是在登录谷歌时&#xff08;有时是自己登录谷歌的网站或者APP&#xff0c;也有的是登录ourplay等加速器、虚拟机等第三方应用&#xff09;&#xff0c;输入了账号后系统却提示说“找不到您的Google账号”&#…

如何在 Odoo 16 中创建名称搜索功能

我们精通 Odoo&#xff0c;了解如何使用关系字段来建立不同模型之间的联系。为了填充这些关系字段&#xff0c;我们经常需要从一整套可用记录中搜索并找到特定值。Odoo 的名称搜索功能简化了此搜索过程&#xff0c;提供了一种根据我们的特定需求自定义搜索的便捷方式。 深入探…

图像识别和目标检测在超市电子秤上的应用

目录 前言深度学习的目标检测图像识别技术视觉秤的优势其他应用场景中的技术应用未来展望 前言 随着科技的不断发展&#xff0c;电子秤在生鲜超市中的应用也在不断升级。传统的电子秤需要打秤人员手动输入秤码&#xff0c;这不仅耗时费力&#xff0c;还需要大量的培训以记住各…

WMS海外仓系统应用:如何改善海外仓的12个核心业务流程

现代化跨境电商的发展依赖海外仓的高效运转&#xff0c;从货物入仓到订单拣货再到最后的货物出库&#xff0c;全部流程都需要海外仓可以顺畅应对。 作为海外仓&#xff0c;则需要借助诸如WMS海外仓系统这样的智能化管理方式&#xff0c;才能适应日益复杂的客户需求。今天我们就…

数据融合工具(4)正方形矩形图幅分幅计算

一、需求背景 对于工程方面需要的局部地区的大比例尺地形图、平面图和中小比例尺挂图和地图集&#xff0c;常使用矩形分幅。 二、矩形分幅 矩形分幅是按平面直接坐标系的横纵坐标线来划分的&#xff0c;图幅的上、下以坐标横轴为界&#xff0c;左、右以坐标纵轴为界。 供各种工…

KIVY ScreenManager 使用案例常见错误总结

# 导入Kivy的App类&#xff0c;它是所有kivy应用的基类 from kivy.app import App # kivy内置了丰富的控件widget 如 按钮button 复选框checkbox 标签label 输入框textinput 滚动容器scrollable container等 from kivy.uix.button import Button # 引入BoxLayout 布局 from ki…

「AI绘画Stable Diffusion 零基础入门 」文生图教程:什么是提示词?万字长文详解提示词的使用,建议收藏!

大家好&#xff0c;我是画画的小强 AI 绘画的一个必不可少的环节就是告诉 AI 描述画面的 Prompt&#xff08;提示词&#xff09;&#xff0c;但是这种很长很乱、穿插着各种奇怪的数字符号、高深莫测的提示词&#xff0c;究竟在说着什么&#xff1f;难道真的是咒语吗&#xff1…

【力扣高频题】042.接雨水问题

上一篇我们通过采用 双指针 的方法解决了 经典 容器盛水 问题 &#xff0c;本文我们接着来学习一道在面试中极大概率会被考到的经典题目&#xff1a;接雨水 问题 。 42. 接雨水 给定 n 个非负整数&#xff0c;表示每个宽度为 1 的柱子的高度图&#xff0c;计算按此排列的柱子…

跨平台桌面应用开发工具:electron的优缺点

跨平台桌面应用开发工具Electron是一个由GitHub开发和维护的开源框架&#xff0c;它允许开发者使用HTML、CSS和JavaScript等Web技术来构建跨平台的桌面应用程序。以下是关于Electron的详细介绍&#xff1a; 一、Electron概述 定义&#xff1a;Electron是一个基于Chromium和Nod…

【《无主之地3》风格角色渲染在Unity URP下的实现_角色渲染(第四篇) 】

文章目录 概要描边问题外秒变分叉解决办法1:测试效果如下:外秒变分叉解决办法2:URP管线下PBR渲染源码关键词解释:完整shader代码如下:URP管线下二次元皮肤渲染源码URP管线下二次元头发渲染源码简要介绍文章的目的、主要内容和读者将获得的知识。 概要 提示:《无主之地3》…

Apache中使用SSI设置

先停服务在修改httpd.conf&#xff0c;备份下 Apache\Apache24\conf 设置httpd.conf LoadModule ssl_module modules/mod_ssl.so 取消该命令前的注释符# AddType text/html .shtml AddOutputFilter INCLUDES .shtml 取消该命令前的注释符# 加入html 搜索Options Indexes …

【STM32标准库】DMA双缓冲模式

1.双缓冲模式简介 设置DMA_SxCR寄存器的DBM位为1可启动双缓冲传输模式&#xff0c;并自动激活循环模式&#xff0c;所以设置普通模式或者循环模式都可以。 双缓冲不应用与存储器到存储器的传输。可以应用在从存储器到外设或者外设到存储器。 双缓冲模式下&#xff0c; 两个存…

pbootCMS 数据库sqlite转mysql数据库

前言 pbootCMS默认使用 sqlite数据库 &#xff0c;那么什么是sqlite数据库呢&#xff1f; SQLite&#xff0c;是一款轻型的数据库&#xff0c;是遵守ACID的关系型数据库管理系统&#xff0c;它包含在一个相对小的C库中。它是D.RichardHipp建立的公有领域项目。它的设计目标是嵌…

叉车指纹锁有规定要装吗

叉车作为工业运输的重要工具&#xff0c;其安全性能一直备受关注。在这个信息化、智能化的时代&#xff0c;对于叉车这类高风险的设备&#xff0c;安全性措施显得尤为重要。而叉车指纹锁作为一种高科技安全设备&#xff0c;其在叉车管理中的应用逐渐受到重视。 那么&#xff0c…

探展2024世界人工智能大会之合合信息扫描黑科技~

文章目录 ⭐️ 前言⭐️ AIGC古籍修复文化遗产焕新⭐️ 高效的文档图像处理解决方案⭐️ AIGC扫描黑科技一键全搞定⭐️ 行业级的大模型加速器⭐️ 结语 ⭐️ 前言 大家好&#xff0c;我是 哈哥&#xff08;哈哥撩编程&#xff09; &#xff0c;这次非常荣幸受邀作为专业观众参…

IP-GUARD如何禁止电脑自带摄像头

IP-GUARD可以通过设备管理模块禁止USB接口&#xff0c;所以USB外置摄像头很容易就可以禁止了。 但是笔记本自带摄像头无法禁止&#xff0c;配置客户端策略如下&#xff1a; device_control_unknown_mode1 device_control_unphysical_mode3