uniapp有关MD5文件上传的方法

news2024/11/4 17:12:42

         请求的Api:

// 合同管理 - 详情 - 附件上传
export function saveAttachmentListApi(data){
  return request({
    url: `/api/supplychain/StandardOnline/saveAttachmentList`,
    method: 'POST',
    data
  })
}

 

// 附件上传
export function chunkMergesOnly(data){
  return request({
    url: `/api/file/mergeAttachmentOnly`,
    method: 'POST',
    data
  })
}
<template>
	<view>
		<u-toast ref="uToast"></u-toast>
		<u-popup v-model="viewVisible" @close="close" mode="center" border-radius="14">
			<view class="usingSealsClass">
				<view class="topTitle">
					<text>合同文件上传</text>
				</view>
				<view class="bottomArea">
					<ss-upload ref="ssUpload" width="260rpx" height="100rpx" @uploadFilepProgress='uploadFilepProgress'
						@uploadSuccess="onuploadSuccess" :uploadOptions="uploadOptions" :isUploadServer="isUploadServer"
						@getFile='getFile'>
						<button class="selectFileClass" @click="uploadFile">上传附件</button>
					</ss-upload>
					<!-- 上传进度条 -->
					<view class="material-sent" v-if="flieProgress !== 0">
						<progress class="select-tips" :percent="flieProgress" stroke-width="4" activeColor="	#19be6b" />
						<view class="tips-text">
							上传进度{{flieProgress}}%
						</view>
					</view>
					<view class="uploadTip">
						<text>注:只能上传"ZIP"类型的文件,压缩包的名称必须为合同号</text>
					</view>
				</view>

				<view class="buttonClass">
					<button size="default" type="default"
						style="width: 100px;height:30px;margin:0px;margin-right:10px;fontSize:14px;lineHeight:30px;color:#ffffff;backgroundColor: #ff5555;border:1px solid  #ff5555"
						@click="cancelClick">取消</button>
					<button size="default" type="default"
						style="width: 100px;height:30px;margin:0px;margin-right:16px;fontSize:14px;lineHeight:30px;color:#ffffff;backgroundColor:#1890ff;border:1px solid #1890ff"
						@click="confirmClick">提交</button>
				</view>
			</view>
		</u-popup>
	</view>
</template>

<script>
	import {
		saveAttachmentListApi,
		chunkMergesOnly
	} from '@/api/apply/standardPlatformApi'
	import SparkMD5 from 'spark-md5';
	export default {
		props: ['config'],
		mounted() {
			this.viewVisible = true;
			this.serverParams.businessIds = [this.config.id];
			this.serverParams.contractNumbers = [this.config.row[0]['CONTRACT_NUMBER']];
		},
		data() {
			return {
				flieProgress: 0,
				isUploadServer: true,
				serverParams: {}, // 业务接口需要的参数
				viewVisible: false,
				uploadOptions: {
					url: this.define.baseURL + '/api/file/chunk',
					name: 'file',
					header: {
						'Authorization': uni.getStorageSync("token")
					},
					formData: {
						chunkNumber: 1,
						chunkSize: 0,
						currentChunkSize: 0,
						totalSize: 0,
						identifier: '',
						filename: '',
						relativePath: '',
						totalChunks: 1,
						fileType: 'application/x-zip-compressed',
						extension: 'zip',
					}
				}
			}
		},
		methods: {
			confirmClick() {
				saveAttachmentListApi(this.serverParams).then(res => {
					if (res.code == 200) {
						this.$refs.uToast.show({
							type: 'success',
							title: '附件上传成功!'
						})
						setTimeout(() => {
							this.viewVisible = false;
							this.$emit('closeCustomDialog', false)
						}, 1000)
					} else {
						this.$refs.uToast.show({
							type: 'error',
							icon: false,
							title: '附件上传失败!',
						})
					}
				}).catch(err => {

				})
			},
			// 上传成功
			onuploadSuccess(e, data) {
				console.log(data,'DADA')
				let extension = this.getFileExtension(data[0].name).extension
				let fileName = this.getFileExtension(data[0].name).currentFileName
				if (extension !== 'zip') {
					this.flieProgress = 0
					this.$refs.uToast.show({
						type: 'warning',
						title: '请上传"ZIP"类型的文件',
						icon: false,
						duration: 3000
					})
					return
				}
				if(fileName !== this.serverParams.contractNumbers) {
					this.flieProgress = 0
					this.$refs.uToast.show({
						type: 'warning',
						title: `当前上传文件名称:【${fileName}】\n当前合同号:【${this.serverParams.contractNumbers}】\n上传的文件名称须为当前合同号,请重新上传!`,
						icon: false,
						duration: 5000
					})
					return
				}
				const form = new FormData()
				form.append('identifier', this.uploadOptions.formData.identifier)
				form.append('fileName', this.uploadOptions.formData.filename)
				form.append('fileSize', this.uploadOptions.formData.totalSize)
				form.append('fileType', 'x-zip-compressed')
				form.append('extension', 'zip')
				form.append('type', 'annex')
				form.append('pathType', 'defaultPath')
				form.append('isAccount', '0')
				form.append('folder', '')
				form.append('moduleId', '')
				form.append('tableName', '')
				form.append('onlineSignature', '1')
				form.append('businessType', '')
				form.append('businessIds', this.serverParams.businessIds)
				form.append('contractNumbers', this.serverParams.contractNumbers)
				let formDataStr = '';
				form.forEach((value, key) => {
					if (formDataStr !== '') {
						formDataStr += '&';
					}
					formDataStr += encodeURIComponent(key) + '=' + encodeURIComponent(value);
				});
				uni.request({
					url: this.define.baseURL + '/api/file/mergeAttachmentOnly',
					method: 'POST',
					data: formDataStr,
					header: {
						'content-type': 'application/x-www-form-urlencoded',
					},
					success: (res) => {
						setTimeout(() => {
							this.flieProgress = 0
							this.$refs.uToast.show({
								type: 'success',
								title: `"${this.uploadOptions.formData.filename}"压缩包成功上传,请点击提交按钮!`,
								icon: false,
								duration:3000
							})
						},500)
						this.serverParams = res.data
					},
					fail: (err) => {
						console.error('请求失败', err);
					}
				});
			},
			close() {
				this.viewVisible = false;
				this.$emit('closeCustomDialog', true)
			},
			cancelClick() {
				this.viewVisible = false;
				this.$emit('closeCustomDialog', true)
			},
			uploadFile() {
				setTimeout(() => {
					this.$refs.ssUpload.uploadFile()
				})
			},
			computeMD5(file) {
				const spark = new SparkMD5.ArrayBuffer()
				const md5 = spark.end()
				this.computeMD5Success(md5)
			},
			computeMD5Success(md5, file) {
				this.uploadOptions.formData.identifier = md5 // 把md5值作为文件的识别码
			},
			getFile(e) {
				this.computeMD5()
				this.uploadOptions.formData.chunkSize = e.tempFiles[0].size
				this.uploadOptions.formData.currentChunkSize = e.tempFiles[0].size
				this.uploadOptions.formData.totalSize = e.tempFiles[0].size
				this.uploadOptions.formData.filename = e.tempFiles[0].name
				this.uploadOptions.formData.relativePath = e.tempFiles[0].name
			},
			getFileExtension(fileName) {
				// 使用 split 方法将文件名按 '.' 分割成数组
				const parts = fileName.split('.');
				// 数组的最后一个元素就是文件的后缀
				const extension = parts[parts.length - 1];
				const currentFileName = parts[0]
				return {extension,currentFileName}
			},
			// 上传文件的回调事件 - 值为:上传进度
			uploadFilepProgress(value) {
				this.flieProgress = value
			}
		}
	}
</script>

<style lang="scss" scoped>
	

	::v-deep .zb-table {
		height: 95% !important;
	}

	.usingSealsClass {
		width: 700rpx;
		height: 400rpx;
		position: relative;

		.topTitle {
			width: 100%;
			height: 80rpx;
			text-align: center;
			border-bottom: 1px dashed lightgrey;
			line-height: 75rpx;
		}

		.bottomArea {
			margin-top: 5px;
			width: 100%;
			height: calc(100% - 90px);
			position: relative;

			.uploadTip {
				position: absolute;
				top: 70px;
				left: 18px;
				color: red;
				font-size: 12px;
			}
			.material-sent {
				width: 189rpx;
				background: rgba(245, 245, 245, 0.5);
				position: absolute;
				display: flex;
				justify-content: center;
				align-items: center;
				flex-direction: column;
				top: 72%;
				.select-tips {
					width: 130rpx;
					height: 10rpx;
					margin-bottom: 12rpx;
				}
			
				.tips-text {
					font-size: 24rpx;
					color: #028DE3;
				}
			}
		}

		.buttonClass {
			position: absolute;
			bottom: 10px;
			width: 100%;
			display: flex;
			justify-content: flex-end;
			align-items: center;
		}
	}
</style>

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

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

相关文章

CoCode助力志晟信息成功通过CMMI五级复评!

热烈祝贺河北志晟信息技术股份有限公司在近期CMMI&#xff08;能力成熟度模型集成&#xff09;评估中&#xff0c;再次以卓越表现顺利通过CMMI成熟度五级的复评。 CoCode助力志晟信息通过CMMI五级 2024年9月1日至10日&#xff0c;CMMI评估组对志晟信息管理体系及其应用运行情况…

AD 授予委派full control权限后,部分用户无法unlock

文章目录 问题描叙根因解決方法&#xff1a; 问题描叙 通過委派方式授予被委派用戶full control 权限后&#xff0c;部分用户unlock是灰色显示&#xff1a; 根因 对比能正常unlock与无法unlock的用户&#xff0c;发现繼承無法unlock的用戶沒有"enable inheritance&quo…

css实现边框双色凹凸半圆

整体效果如下图&#xff1a; 结构代码&#xff1a; <div classline-outside-wrap><div classwrap><img src../img/avatar2x.png/><div classcontent-wrap></div></div></div> 内凹框实现&#xff1a; .content-wrap{width:100%;he…

算法深度剖析:前缀和

文章目录 前言一、一维前缀和模板二、二维前缀和模板三、寻找数组的中心下标四、除自身以外数组的乘积五、和为 K 的子数组六、和可被 K 整除的子数组七、连续数组八、矩阵区域和 前言 本章将深度剖析前缀和&#xff0c;以及总结前缀和模板。 前缀和是一种在算法和数据处理中…

关于我、重生到500年前凭借C语言改变世界科技vlog.14——常见C语言算法

文章目录 1.冒泡排序2.二分查找3.转移表希望读者们多多三连支持小编会继续更新你们的鼓励就是我前进的动力&#xff01; 根据当前所学C语言知识&#xff0c;对前面知识进行及时的总结巩固&#xff0c;出了这么一篇 vlog 介绍当前所学知识能遇到的常见算法&#xff0c;这些算法是…

特定领域的Embeddings模型微调全面指南

假设你正在为医学领域构建一个问答系统。你希望确保当用户提出问题时&#xff0c;系统能够准确地检索相关的医学文章。但是通用的嵌入模型可能在处理医学术语的高度专业化词汇和细微差别时会遇到困难。 这时候&#xff0c;微调就能派上用场了&#xff01;&#xff01;&#xf…

视频推荐的算法(字节青训)

题目&#xff1a; 西瓜视频 正在开发一个新功能&#xff0c;旨在将访问量达到80百分位数以上的视频展示在首页的推荐列表中。实现一个程序&#xff0c;计算给定数据中的80百分位数。 例如&#xff1a;假设有一个包含从1到100的整数数组&#xff0c;80百分位数的值为80&#…

安卓13默认连接wifi热点 android13默认连接wifi

总纲 android13 rom 开发总纲说明 文章目录 1.前言2.问题分析3.代码分析4.代码修改5.编译6.彩蛋1.前言 有时候我们需要让固件里面内置好,相关的wifi的ssid和密码,让固件起来就可以连接wifi,不用在手动操作。 2.问题分析 这个功能,使用普通的安卓代码就可以实现了。 3.代…

详解RabbitMQ三种队列类型

RabbitMQ 是一个强大的消息队列系统&#xff0c;它提供了多种队列类型以满足不同的使用需求。本文将探讨三种主要队列类型&#xff1a;经典队列、仲裁队列和流式队列&#xff0c;并讨论它们的区别和选型建议。 经典队列&#xff08;Classic Queues&#xff09; 简介&#xff…

CytoSPACE·空转和单细胞数据的高分辨率比对

1. 准备输入文件&#xff0c;需要四个文件&#xff0c;所有文件都应以制表符分隔的表格输入格式 (.txt) 提供。 a. scRNA-seq 基因表达文件 矩阵必须是基因&#xff08;行&#xff09;乘以细胞&#xff08;列&#xff09;。 第一行必须包含单个细胞 ID&#xff0c;第一列必须…

react使用Fullcalendar

前言&#xff1a; 最近在做项目时&#xff0c;遇到了需要用日历的项目。一开始考虑使用antd的日历组件。后来 调研技术库&#xff0c;发现了fullcalendar 库。经过对比 fullcalendar 更强大&#xff0c;更灵活。 其实 antd的日历组件 也不错&#xff0c;简单的需求用他也行。…

LabVIEW过程控制实验平台

A3000实验平台通过LabVIEW开发&#xff0c;实现了过程控制的虚拟仿真与实时通信&#xff0c;显著提高了教学与实验的互动性和效率。该平台采用模块化设计&#xff0c;支持多种控制策略的实验教学&#xff0c;克服了传统实验设备的不足。项目背景 目前高校过程控制实验设备普遍…

腾讯会议pc端3.29.11开启悬浮窗口

之前是&#xff1a;pc端每次最小化&#xff0c;它就自动收回到任务栏里了 版本&#xff1a;3.29.11 解决办法&#xff1a; 打开腾讯会议&#xff0c;点击左上角的【头像】。 单击【设置】。 选择【显示当前说话者】来管理麦克风浮窗。 再进入会议&#xff0c;点击最小化一哈&…

聊一聊:ChatGPT搜索引擎会取代谷歌和百度吗?

当地时间 10 月 31 日&#xff0c;OpenAI 正式推出了 ChatGPT 搜索功能&#xff0c;能实时、快速获取附带相关网页来源链接的答案。这一重大升级标志着其正式向谷歌的搜索引擎霸主地位发起挑战。 本周五我们聊一聊&#xff1a; 欢迎在评论区畅所欲言&#xff0c;分享你的观点~ …

贪心算法习题其四【力扣】【算法学习day.21】

前言 ###我做这类文档一个重要的目的还是给正在学习的大家提供方向&#xff08;例如想要掌握基础用法&#xff0c;该刷哪些题&#xff1f;&#xff09;我的解析也不会做的非常详细&#xff0c;只会提供思路和一些关键点&#xff0c;力扣上的大佬们的题解质量是非常非常高滴&am…

python实战项目52:Selenium爬取steam黑神话悟空评论

python实战项目52:Selenium爬取steam黑神话悟空评论 一、思路分析二、完整代码一、思路分析 Selenium爬取steam游戏评论的思路非常简单,初始化Chromedriver,然后打开评论页面,循环下拉滚动条,每下拉一次滚动条获取一次页面源代码,使用xpath解析数据并保存数据。本文的主…

Claude 3.5 新功能 支持对 100 页的PDF 图像、图表和图形进行可视化分析

Claude 3.5 Sonnet发布PDF图像预览新功能&#xff0c;允许用户分析长度不超过100页的PDF中的视觉内容。 此功能使用户能够轻松上传文档并提取信息&#xff0c;特别适用于包含图表、图形和其他视觉元素的研究论文和技术文档。 视觉PDF分析&#xff1a;用户现在可以从包含各种视觉…

【Qt c++】Qt内置图标

Qt内置图标 前言简例示例 前言 Qt内置图标封装在QStyle中&#xff0c;大概七十多个图标&#xff0c;可以直接拿来用。图标的大小&#xff1a;我认为 size 30 还是可以的. 简例 SP_TitleBarMenuButton, SP_TitleBarMinButton, SP_TitleBarMaxButton, SP_TitleBarCloseButton…

Redis 的使⽤和原理

第一章:初识 Redis 1.1盛赞 Redis Redis 是⼀种基于键值对&#xff08;key-value&#xff09;的 NoSQL 数据库&#xff0c;与很多键值对数据库不同的是&#xff0c;Redis 中的值可以是由 string&#xff08;字符串&#xff09;、hash&#xff08;哈希&#xff09;、list&…

【Clikhouse 探秘】ClickHouse 物化视图:加速大数据分析的新利器

&#x1f449;博主介绍&#xff1a; 博主从事应用安全和大数据领域&#xff0c;有8年研发经验&#xff0c;5年面试官经验&#xff0c;Java技术专家&#xff0c;WEB架构师&#xff0c;阿里云专家博主&#xff0c;华为云云享专家&#xff0c;51CTO 专家博主 ⛪️ 个人社区&#x…