yudao 文件分片上传

FileController

    @GetMapping("/file-url")@Operation(summary = "获取文件地址")@ApiResponse(description = "0文件不存在")@OperateLog(enable = false)public CommonResult<String> getFileUrl(String identifier) {String url0 = fileService.getFirstUrlByName(identifier);if (url0 != null) {return success(url0);}return success("0");}@PostMapping("/chunks-upload")@Operation(summary = "上传文件", description = "模式二:分片上传文件")@ApiResponse(description = "0:上传失败,1:上传成功")@OperateLog(enable = false)public CommonResult<String> uploadChunks(FileChunkUploadReqVO chunkUploadReqVO) throws Exception {MultipartFile file = chunkUploadReqVO.getFile();String identifier = chunkUploadReqVO.getIdentifier();Long number = chunkUploadReqVO.getNumber();Long total = chunkUploadReqVO.getTotal();String filename = StrUtil.format("{}_{}", total, number);String filepath = getSrcDir(identifier) + "/" + filename;if (!FileUtil.exist(filepath)) {// 1、创建分片文件File chunking = FileUtil.touch(filepath + ".chunking");FileUtil.writeBytes(file.getBytes(), chunking);// 2、上传成功后删除后缀FileUtil.rename(chunking, filename, true);}return success("1");}@GetMapping("/chunks-merge")@Operation(summary = "合并文件", description = "模式二:分片上传文件")@OperateLogpublic CommonResult<String> mergeChunks(String identifier, String path) throws Exception {// 1、创建文件String url = fileService.createFile(identifier, path,new byte[0]);File tarFile = fileService.getLocalFile(url);if (tarFile == null) {throw new ServiceException("文件不存在,暂只支持本地分片文件的合并");}// 2、合并至文件String srcDir = getSrcDir(identifier);mergeChunks(srcDir, tarFile);// 3、删除临时目录FileUtil.del(srcDir);return success(url);}private String getSrcDir(String identifier) {return "~/temp/" + identifier;}private void mergeChunks(String srcDir, File tarFile) {if (FileUtil.exist(srcDir)) {File[] files = FileUtil.ls(srcDir);Arrays.sort(files, (o1, o2) -> {Integer n1 = Integer.valueOf(o1.getName().replace("_", ""));Integer n2 = Integer.valueOf(o2.getName().replace("_", ""));return n1 - n2;});// 合并for (File file : files) {if (file.getName().endsWith(".chunking")) {continue;}byte[] content = FileUtil.readBytes(file);FileUtil.writeBytes(content, tarFile, 0, content.length, true);}}}

FileService

    /*** 通过url获取文件的实际存储对象* @param url 文件url* @return 文件绝对路径*/File getLocalFile(String url);/*** 获取url,该方法的前提是使用name存储md5或其他算法生成的文件唯一标识,从而保证打文件秒传* @param name 文件name* @return 文件url*/String getFirstUrlByName(String name);

tstup.html

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Chunked File Upload</title><script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/4.1.1/crypto-js.min.js"></script><style>#progressContainer {width: 100%;background-color: #f3f3f3;}#progressBar {width: 0%;height: 30px;background-color: #4caf50;}</style>
</head>
<body>
<h1>Chunked File Upload</h1>
<input type="file" id="fileInput"/>
<button onclick="uploadFile()">Upload</button>
<div id="progressContainer"><div id="progressBar"></div>
</div><script>const chunkSize = 2 * 1024 * 1024; // 2MB per chunklet fileInput = document.getElementById('fileInput');async function uploadFile() {const file = fileInput.files[0];if (!file) {alert('Please select a file');return;}const totalChunks = Math.ceil(file.size / chunkSize);const identifier = generateIdentifier(file);const path = file.name; // adjust as neededfor (let i = 0; i < totalChunks; i++) {const start = i * chunkSize;const end = Math.min(file.size, start + chunkSize);const chunk = file.slice(start, end);const formData = new FormData();formData.append('file', chunk);formData.append('path', path);formData.append('identifier', identifier);formData.append('number', i + 1);formData.append('total', totalChunks);try {const response = await fetch('http://localhost:20611/admin-api/infra/file/chunks-upload', {method: 'POST',body: formData,headers: {'Authorization': 'Bearer 6ec7f94e414943d893fa5a63d4ad1bad'}});const result = await response.json();if (result.data !== '1' && result.data !== '0') i = totalChunks;console.log('Chunk upload response:', result);// Update the progress barupdateProgressBar((i + 1) / totalChunks * 100);} catch (error) {console.error('Error uploading chunk:', error);}}// Merge chunks after all are uploadedtry {const response = await fetch(`http://localhost:20611/admin-api/infra/file/chunks-merge?identifier=${identifier}&path=${path}`, {method: 'GET',headers: {'Authorization': 'Bearer 6ec7f94e414943d893fa5a63d4ad1bad'}});const result = await response.json();console.log('Merge response:', result);alert('File uploaded and merged successfully');} catch (error) {console.error('Error merging chunks:', error);}}function updateProgressBar(percentage) {const progressBar = document.getElementById('progressBar');progressBar.style.width = percentage + '%';}function generateIdentifier(file) {return CryptoJS.MD5(CryptoJS.enc.Latin1.parse(file)).toString();}
</script>
</body>
</html>

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

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

相关文章

大模型实战-动手实现单agent

文章目录 入口cli_main.py工具tools.pyprompt prompt_cn.pyLLM 推理 model_provider.py致谢 agent 的核心思想&#xff1a;不断调用 LLM&#xff08;多轮对话&#xff09;&#xff0c;让 LLM 按照指定的格式&#xff08;例如 json&#xff09;进行回复&#xff0c;提取 LLM 回复…

仅1天录用!3天见刊!这本毕业“水刊”,全科都收,极速上线!

【欧亚科睿学术】 01 期刊简介 【期刊类别】计算机工程类EI 【期刊简介】最新EI期刊目录内源刊 【版面情况】仅10篇版面 【审稿周期】预计2-4周左右录用 【检索情况】EI&Scopus双检 【征稿领域】计算机工程领域相关稿件均可。 02 征稿领域 该期刊发表有关计算机在各…

使用`War`包部署`Jenkins`(超级详细)

使用War包部署Jenkins(超级详细) 别着急&#xff0c;你看这年复一年&#xff0c;春光不必趁早&#xff0c;冬霜不会迟到。过去的都会过去&#xff0c;该来的都在路上&#xff0c;一切都是刚刚好。 网站说明 https://get.jenkins.io/war-stable/ war包下载地址 https://www.jenk…

Python | R | MATLAB群体消息和遗传病筛选多元统计模型

&#x1f3af;要点 &#x1f3af;概率分布结构模型&#xff1a;有向无环图模型结构、部分有向无环图、动态贝叶斯网络、结构方程模型、广义噪声或模型、连接树、聚类图、因子图、马尔可夫链 | &#x1f3af;多类分类模型&#xff1a;朴素贝叶斯分类器、求和朴素贝叶斯分类器、…

合作伙伴推广不积极?跟奖金到账时间有关!

在推广返现活动中&#xff0c;对于合作伙伴推广者来说&#xff0c;奖金是否及时到账是他们最关心的问题之一。如果品牌主一直不审批奖励数据&#xff0c;推广者则无法及时收到奖金&#xff0c;这很容易影响他们的推广积极性和忠诚度。怎样能够提高奖励审核的效率呢&#xff1f;…

java中Future使用详细介绍

一、什么是Future&#xff1f; 在并发编程中&#xff0c;可以通过Future对象来异步获取结果。 使用Thread或runnable接口都不能获取异步的执行结果&#xff0c;因为他们没有返回值。而通过实现Callable接口和Future就可以获取异步执行的结果&#xff0c;当异步执行结束后&…

SSRS中使用QRCoder生成二维码

步骤 1.下载QRCoder.dll 下载地址&#xff1a;https://download.csdn.net/download/wjl7126180/89369398 2.使用gacutil.exe安装QRCoder.dll到GAC(Global Assembly Cache) gacutil.exe是.NET Framework中的全局程序集缓存工具&#xff0c;如果没有安装.NET Framework&#…

怎么把纸质文件扫描成电子版?方法教会你!

怎么把纸质文件扫描成电子版&#xff1f;在数字化时代&#xff0c;将纸质文件转换为电子版已成为日常工作和学习的必备技能。无论是合同、证件、笔记还是其他文档&#xff0c;通过扫描软件都能轻松实现电子化&#xff0c;方便存储、查阅和分享。以下将介绍几款功能强大、操作简…

身份认证页面该怎么设计更加合理?

一、认证页面的作用 认证页面在应用程序中具有以下几个重要的作用&#xff1a; 验证用户身份&#xff1a;认证页面的主要作用是验证用户的身份。通过要求用户提供正确的凭据&#xff08;如用户名和密码、生物特征、验证码等&#xff09;&#xff0c;认证页面可以确认用户是合法…

Linux 生产跑批脚本解读

1.查看定时任务 2.脚本-目录结构 1&#xff09;config.ini 2&#xff09;run.sh 3.命令解读 1&#xff09;ls -1 路径文件夹 含义&#xff1a;ls -1 /home/oracle/shell/config/ 将文件夹config内的文件全部列出 [oracleneptune config]$ ls -1 /home/oracle/shel…

C#转义字符

转义字符 是字符串的一部分 用来表示特殊含义的字符 比如 在字符串中表示 单引 双引 空行.... 使用方法: string str "恁好啊 \n恁好啊 靓仔";* 常用的转义字符 单引号 \ 双引号 \" 换行 \n 斜杠 \\ 制表符 (tab键&#xff09; \t 空字符 \0 光标退格 \b 警报…

适合下班做的副业兼职、1天挣300,7天涨粉2万

最近小红书上有类视频火了&#xff01; 周周近财&#xff1a;让网络小白少花冤枉钱&#xff0c;赚取第一桶金 利用AI制作的漫画解说历史小说视频。视频以《明朝那些事儿》为蓝本&#xff0c;一上线就疯狂吸粉&#xff0c;多条视频内容都大爆了。 就是这个账号&#xff0c;仅仅…

【华为】BFD与静态路由和RIP联用

【华为】BFD与静态路由和RIP联用 实验需求配置AR1AR2AR3AR4效果抓包查看 实验需求 如上图组网所示&#xff0c;在R1上配置到达R4的Loopback0。 4.4.4.4/32网段的浮动静态路由&#xff0c;正常情况下通过R3访问R4。 当R3故障时&#xff0c;自动选路通过R2访问R4的Loopback0;在R…

Oracle DataGuard 保护级别

Oracle DataGuard 保护级别介绍 ADG 有三个保护级别&#xff0c;如下&#xff1a; 一、MAXIMUM PROTECTION 特点&#xff1a; 1、数据0丢失 2、最高级别保护 3、主备必须采用 OPTIONAL LGWR SYNC AFFIRM 的传输方式 4、备机必须启用 standby redo log 5、如果备机不可用(如…

了解K8s集群kubectl命令进行陈述式资源管理

前言 在 Kubernetes 集群中&#xff0c;通过陈述式和声明式资源管理是确保应用程序高效运行的关键。认识这两种管理方法&#xff0c;能够更好地掌握 Kubernetes 集群的运维和管理。 目录 一、K8s 资源管理操作分类 1. 陈述式 2. 声明式 3. K8s 集群管理常用命令概览 二…

基于瑞萨RA6M5的自控衣橱

1. 主控转接板原理图和PCB设计 2. 屏幕界面设计 3. 程序设计 4. QT设计 QT设计&#xff0c;读取MQTT数据&#xff0c;在QT上显示衣橱内部的温度&#xff0c;湿度情况&#xff0c;且能够控制衣橱的开关门&#xff0c;开关灯等。 5. 实物演示 瑞萨

数据库缓存 buffer pool详解

什么是buffer pool buffer pool, 又称之缓存池, 是mysql中为了提升查询性能而引入的缓存, 如果每次查询和修改都去操作磁盘的话, 性能就会很差, 从而引入 Buffer Pool包含多个缓冲页&#xff08;默认大小通常为16KB&#xff09;&#xff0c;每个缓冲页都有对应的控制信息&#…

Python 机器学习 基础 之 模型评估与改进 【评估指标与评分】的简单说明

Python 机器学习 基础 之 模型评估与改进 【评估指标与评分】的简单说明 目录 Python 机器学习 基础 之 模型评估与改进 【评估指标与评分】的简单说明 一、简单介绍 二、评估指标与评分 1、牢记最终目标 2、二分类指标 1&#xff09;错误类型 2&#xff09;不平衡数据集…

【产品运营】对接上游电商平台需要了解什么?

围绕卖家和平台的运营模式等维度&#xff0c;ISV对接平台可以划分为业务域、开放能力域和产品能力域。 ISV对接平台的最终目地是打通多方数据传输&#xff0c;解决卖家日常运营中的场景起到类似于业务中台的作用。因此我们可以围绕卖家和平台的运营模式等维度划分为&#xff1a…

Qt多进程-共享内存(Shared Memory)

在Qt中使用共享内存&#xff08;Shared Memory&#xff09;进行多进程程序开发&#xff0c;主要涉及以下步骤、代码示例和相关注意事项&#xff1a; 步骤&#xff1a; 创建共享内存区域&#xff1a; 使用QSharedMemory类来创建一个共享内存对象。设定一个唯一的共享内存键名&…