当前位置: 首页 > article >正文

断点续传使用场景,完整前后端实现示例,包括上传,下载,验证

断点续传在多个场景中非常有用,包括但不限于大文件上传、跨国或跨区域文件传输、移动设备文件传输、备份和同步以及软件更新等。接下来,我将为你提供一个基于Java的后端实现示例,结合前端逻辑来完成整个断点续传的功能,包括上传、下载和验证。

后端实现(使用Spring Boot)

添加依赖

首先,在pom.xml中添加必要的依赖:

<dependencies><!-- Spring Web --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- Apache Commons IO for file handling --><dependency><groupId>commons-io</groupId><artifactId>commons-io</artifactId><version>2.11.0</version></dependency><!-- Jackson for JSON processing --><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId></dependency>
</dependencies>
控制器代码
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.FilenameUtils;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;import java.io.*;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.*;@RestController
@RequestMapping("/api")
public class FileController {private static final String UPLOAD_DIR = "uploads/";@PostMapping("/upload")public ResponseEntity<?> uploadChunk(@RequestParam("file") MultipartFile file,@RequestParam("fileName") String fileName,@RequestParam("chunkIndex") int chunkIndex,@RequestParam("totalChunks") int totalChunks) throws IOException {// 创建目录String dirPath = UPLOAD_DIR + fileName;new File(dirPath).mkdirs();// 保存分片File chunkFile = new File(dirPath, chunkIndex + ".part");try (OutputStream os = new FileOutputStream(chunkFile)) {os.write(file.getBytes());}// 记录已上传的分片Set<Integer> uploadedChunks = loadUploadedChunks(fileName);uploadedChunks.add(chunkIndex);saveUploadedChunks(fileName, uploadedChunks);if (uploadedChunks.size() == totalChunks) {mergeChunks(fileName, totalChunks);}return ResponseEntity.ok().build();}@GetMapping("/download")public ResponseEntity<byte[]> download(@RequestParam("fileName") String fileName) throws IOException {String filePath = UPLOAD_DIR + fileName + "/" + fileName;byte[] bytes = Files.readAllBytes(Paths.get(filePath));return ResponseEntity.ok().header("Content-Disposition", "attachment; filename=" + fileName).body(bytes);}@GetMapping("/check")public ResponseEntity<Map<String, Object>> check(@RequestParam("fileName") String fileName) {Set<Integer> uploadedChunks = loadUploadedChunks(fileName);Map<String, Object> response = new HashMap<>();response.put("uploadedChunks", uploadedChunks);return ResponseEntity.ok(response);}private Set<Integer> loadUploadedChunks(String fileName) {String filePath = UPLOAD_DIR + fileName + "/uploadedChunks.json";File file = new File(filePath);Set<Integer> chunks = new HashSet<>();if (file.exists()) {try {chunks = new HashSet<>(Arrays.asList(FileUtils.readFileToString(file, "UTF-8").split(","))).stream().map(Integer::parseInt).collect(Collectors.toSet());} catch (IOException e) {e.printStackTrace();}}return chunks;}private void saveUploadedChunks(String fileName, Set<Integer> uploadedChunks) {String filePath = UPLOAD_DIR + fileName + "/uploadedChunks.json";try {FileUtils.writeStringToFile(new File(filePath), String.join(",", uploadedChunks.stream().map(String::valueOf).toList()), "UTF-8");} catch (IOException e) {e.printStackTrace();}}private void mergeChunks(String fileName, int totalChunks) throws IOException {String dirPath = UPLOAD_DIR + fileName;String mergedFilePath = UPLOAD_DIR + fileName + "/" + fileName;try (OutputStream os = new FileOutputStream(mergedFilePath)) {for (int i = 0; i < totalChunks; i++) {File chunkFile = new File(dirPath, i + ".part");byte[] bytes = Files.readAllBytes(chunkFile.toPath());os.write(bytes);Files.delete(chunkFile.toPath());}}}
}

前端实现(使用Vue.js)

安装依赖

确保你已经安装了axios用于HTTP请求处理:

npm install axios
上传组件
<template><div><input type="file" @change="selectFile"><button @click="upload">上传</button></div>
</template><script>
import axios from 'axios';export default {data() {return {file: null,chunkSize: 5 * 1024 * 1024, // 5MBuploadedChunks: []};},methods: {selectFile(e) {this.file = e.target.files[0];this.uploadedChunks = [];},async upload() {const fileName = this.file.name;const totalChunks = Math.ceil(this.file.size / this.chunkSize);// 获取已上传的分片信息const { data } = await axios.get('/api/check', { params: { fileName } });this.uploadedChunks = data.uploadedChunks;for (let i = 0; i < totalChunks; i++) {if (this.uploadedChunks.includes(i)) continue;const start = i * this.chunkSize;const end = Math.min(start + this.chunkSize, this.file.size);const chunk = this.file.slice(start, end);const formData = new FormData();formData.append('file', new Blob([chunk]));formData.append('fileName', fileName);formData.append('chunkIndex', i);formData.append('totalChunks', totalChunks);await axios.post('/api/upload', formData);this.uploadedChunks.push(i);}alert('文件上传成功');}}
};
</script>
下载组件
<template><div><input type="text" v-model="fileName"><button @click="download">下载</button></div>
</template><script>
import axios from 'axios';export default {data() {return {fileName: ''};},methods: {async download() {const response = await axios.get('/api/download', { params: { fileName: this.fileName }, responseType: 'blob' });const url = window.URL.createObjectURL(new Blob([response.data]));const link = document.createElement('a');link.href = url;link.setAttribute('download', this.fileName);document.body.appendChild(link);link.click();}}
};
</script>
验证组件
<template><div><input type="text" v-model="fileName"><button @click="check">验证</button><p>已上传分片:{{ uploadedChunks }}</p></div>
</template><script>
import axios from 'axios';export default {data() {return {fileName: '',uploadedChunks: []};},methods: {async check() {const { data } = await axios.get('/api/check', { params: { fileName: this.fileName } });this.uploadedChunks = data.uploadedChunks;}}
};
</script>

这个示例展示了如何使用Spring Boot作为后端,并结合Vue.js前端来实现断点续传功能。你可以根据自己的需求进行调整和优化,例如增加错误处理、进度条显示等功能。

相关文章:

断点续传使用场景,完整前后端实现示例,包括上传,下载,验证

断点续传在多个场景中非常有用&#xff0c;包括但不限于大文件上传、跨国或跨区域文件传输、移动设备文件传输、备份和同步以及软件更新等。接下来&#xff0c;我将为你提供一个基于Java的后端实现示例&#xff0c;结合前端逻辑来完成整个断点续传的功能&#xff0c;包括上传、…...

【行为型之迭代器模式】游戏开发实战——Unity高效集合遍历与场景管理的架构精髓

文章目录 &#x1f504; 迭代器模式&#xff08;Iterator Pattern&#xff09;深度解析一、模式本质与核心价值二、经典UML结构三、Unity实战代码&#xff08;背包系统遍历&#xff09;1. 定义迭代器与聚合接口2. 实现具体聚合类&#xff08;背包物品集合&#xff09;3. 实现具…...

Vuetify框架使用(一)之v-snackbar 组件封装及全局使用

说明&#xff1a;v-snackbar 组件适用于统一管理消息提示框(操作反馈的提示) 看效果&#xff1a; 1、在状态管理中创建文件&#xff0c;统一管理 // stores/snackbar.js /*** 统一管理消息提示框(操作反馈的提示)*/import { defineStore } from pinia; // 消息类型 export co…...

FPGA: UltraScale+ bitslip实现(方案+代码)

收获 一晃五年~ 五年前那个夏夜&#xff0c;我对着泛蓝的屏幕敲下《给十年后的自己》&#xff0c;在2020年的疫情迷雾中编织着对未来的想象。此刻回望&#xff0c;第四届集创赛的参赛编号仍清晰如昨&#xff0c;而那个在家熬夜焊电路板的"不眠者"&#xff0c;现在…...

【SpeechLMs】语音大型语言模型综述《A Survey on Speech Large Language Models》

摘要 大型语言模型 (LLM) 表现出强大的上下文理解能力和显著的多任务性能。 因此&#xff0c;研究人员一直在寻求将 LLM 整合到更广泛的语音语言理解 (SLU) 领域。 与传统方法不同&#xff0c;传统方法是将 LLM 级联以处理自动语音识别 (ASR) 生成的文本&#xff0c;而新方法则…...

C# 实现雪花算法(Snowflake Algorithm)详解与应用

在现代分布式系统中&#xff0c;生成全局唯一的标识符&#xff08;ID&#xff09;是一个非常重要的问题。随着微服务架构和分布式系统的普及&#xff0c;传统的单机数据库生成 ID 的方式已无法满足高并发和高可用的需求。为了解决这个问题&#xff0c;Twitter 提出了 雪花算法&…...

吴恩达机器学习笔记:特征与多项式回归

1.特征和多项式回归 如房价预测问题&#xff0c; ℎθ (x) θ0 θ1 frontage θ2 deptℎ x1 frontage&#xff08;临街宽度&#xff09;&#xff0c;x2 deptℎ&#xff08;纵向深度&#xff09;&#xff0c;x frontage ∗ deptℎ area &#xff08;面积&#xff09;…...

Flutter 与HarmonyOS Next 混合渲染开发实践:以 fluttertpc_scan 三方库为例

一、背景与价值 在跨平台开发中&#xff0c;Flutter 以其高效的 UI 构建能力著称&#xff0c;而鸿蒙 Next&#xff08;OpenHarmony&#xff09;则提供了深度系统集成的原生能力。将两者结合&#xff0c;可实现 UI 跨平台 原生功能深度融合 的混合渲染模式。本文以扫描库 flut…...

LangChain4j正式发布-简化将 LLM 集成到 Java 应用程序过程

LangChain4j 的目标是简化将 LLM 集成到 Java 应用程序中的过程。 官网地址 源码地址 开源协议&#xff1a;Apache License 2.0 实现方法 统一 API&#xff1a;LLM 提供程序&#xff08;如 OpenAI 或 Google Vertex AI&#xff09;和嵌入&#xff08;矢量&#xff09;存储…...

【C++】汇编角度分析栈攻击

栈攻击 介绍原理示例代码汇编分析 介绍原理 核心原理是通过 缓冲区溢出&#xff08;Buffer Overflow&#xff09; 等漏洞&#xff0c;覆盖栈上的关键数据&#xff08;如返回地址、函数指针&#xff09;&#xff0c;从而改变程序执行流程&#xff1b; 在 C 中&#xff0c;每个…...

Vue 3 打开 el-dialog 时使 el-input 获取焦点

运行代码&#xff1a;https://andi.cn/page/622178.html 效果&#xff1a;...

C++23 views::repeat (P2474R2) 深入解析

文章目录 引言C20 Ranges库回顾什么是Rangesstd::views的作用 views::repeat概述基本概念原型定义工作原理应用场景初始化容器模拟测试数据 总结 引言 在C的发展历程中&#xff0c;每一个新版本都会带来一系列令人期待的新特性&#xff0c;这些特性不仅提升了语言的性能和表达…...

HTML5 定位详解:相对定位、绝对定位和固定定位

在HTML5和CSS中&#xff0c;定位(positioning)是控制元素在页面上位置的重要机制。主要有四种定位方式&#xff1a;静态定位(static)、相对定位(relative)、绝对定位(absolute)和固定定位(fixed)。下面我将详细讲解这三种非静态定位方式&#xff0c;并提供相应的源代码示例。 …...

OpenCv高阶(4.0)——案例:海报的透视变换

文章目录 前言一、工具函数模块1.1 图像显示函数1.2 保持宽高比的缩放函数1.3 坐标点排序函数 二、透视变换核心模块2.1 四点透视变换实现 三、主流程技术分解3.1 图像预处理3.2 轮廓检测流程3.3 最大轮廓处理 四、后处理技术4.1 透视变换4.2 形态学处理 五、完整代码总结 前言…...

光谱相机的图像预处理技术

光谱相机的图像预处理技术旨在消除噪声、增强有效信息&#xff0c;为后续分析提供高质量数据。 一、预处理流程与技术要点 ‌辐射校正‌ ‌辐射定标‌&#xff1a;将图像灰度值转换为绝对辐射亮度&#xff0c;常用反射率法、辐亮度法和辐照度法消除传感器响应差异&#xff0…...

CSS 溢出内容处理、可见性控制与盒类型设置深度解析

CSS溢出内容处理、可见性控制与盒类型设置深度解析 一、溢出内容处理&#xff08;Overflow&#xff09; 在网页设计中&#xff0c;内容超出容器边界是常见问题。CSS提供了overflow属性及其变体来控制这种情况。 1.1 溢出基本属性 核心属性&#xff1a; overflow: visible&…...

k8s监控方案实践补充(一):部署Metrics Server实现kubectl top和HPA支持

k8s监控方案实践补充&#xff08;一&#xff09;&#xff1a;部署Metrics Server实现kubectl top和HPA支持 文章目录 k8s监控方案实践补充&#xff08;一&#xff09;&#xff1a;部署Metrics Server实现kubectl top和HPA支持一、Metrics Server简介二、Metrics Server实战部署…...

从代码学习深度学习 - 实战 Kaggle 比赛:图像分类 (CIFAR-10 PyTorch版)

文章目录 前言1. 读取并整理数据集1.1 读取标签文件1.2 划分训练集和验证集1.3 整理测试集1.4 执行数据整理2. 图像增广2.1 训练集图像变换2.2 测试集(和验证集)图像变换3. 读取数据集3.1 创建 Dataset 对象3.2 创建 DataLoader 对象4. 定义模型4.1 获取 ResNet-18 模型4.2 损…...

【数据结构】二分查找5.12

Basic 需求&#xff1a;在有序数组A内&#xff0c;查找值target 如果找到返回索引 如果找不到返回-1 算法描述&#xff1a; 前提&#xff1a;给定一个内含n个元素的有序数组A&#xff08;升序&#xff09;&#xff0c;一个待查找值 设置两个索引&#xff1a;i0;jn-1; 如果…...

深入探索向量数据库:构建智能应用的新基础

&#x1f4cc; 友情提示&#xff1a; 本文内容由银河易创AI&#xff08;https://ai.eaigx.com&#xff09;创作平台的gpt-4-turbo模型辅助生成&#xff0c;旨在提供技术参考与灵感启发。文中观点或代码示例需结合实际情况验证&#xff0c;建议读者通过官方文档或实践进一步确认…...

Swagger go中文版本手册

Swaggo(github.com/swaggo/swag)的注解语法是基于 OpenAPI 2.0 (以前称为 Swagger 2.0) 规范的,并添加了一些自己的约定。 主要官方文档: swaggo/swag GitHub 仓库: 这是最权威的来源。 链接: https://github.com/swaggo/swag重点关注: README.md: 包含了基本的安装、使用…...

Cloudera CDP 7.1.3 主机异常关机导致元数据丢失,node不能与CM通信

问题描述 plaintext ERROR Could not load post-deployment data from /var/run/cloudera-scm-agent/process/ccdeploy_hadoop-conf_etchadoopconf.cloudera.yarn_-8903374259073700469 IOError: [Errno 2] No such file or directory: /var/run/cloudera-scm-agent/proce…...

Redis特性与应用

1、分布式缓存与redis 2、redis数据结构和客户端集成 3、缓存读写模式与数据一致性 本地缓存&#xff1a;Hash Map、Ehcache、Caffeine、Google Guava 分布式缓存&#xff1a;Memcached、redis、Hazelcast、Apache ignite redis&#xff1a;基于键值对内存数据库&#xff0c;支…...

嵌入式调试新宠!J-Scope:免费+实时数据可视化,让MCU调试效率飙升!

&#x1f4cc; 痛点直击&#xff1a;调试还在用“断点打印”&#xff1f; 嵌入式开发中&#xff0c;你是否也经历过这些崩溃瞬间&#xff1f; 想实时观察变量变化&#xff0c;代码里插满printf&#xff0c;结果拖垮系统性能&#xff1f; 断点调试打断程序运行&#xff0c;时序…...

微信小程序学习之搜索框

1、第一步&#xff0c;我们在index.json中引入vant中的搜索框控件&#xff1a; {"usingComponents": {"van-search": "vant/weapp/search/index"} } 2、第二步&#xff0c;直接在index.wxml中添加布局&#xff1a; <view class"index…...

Altium Designer AD如何输出PIN带网络名的PDF装配图

Altium Designer AD如何输出PIN带网络名的PDF装配图 文描述在Altium Designer版本中设置焊盘网络名时遇到的问题&#xff0c;网络名大小不一致&#xff0c;部分PAD的网络名称未显示&#xff0c;可能涉及字符大小设置和版本差异。 参考 1.AD导出PCB装配图 https://blog.csd…...

VMware虚拟机 安装 CentOS 7

原文链接: VMware虚拟机 安装 CentOS 7 安装准备 软件: VMware Workstation Pro 17.6.3 镜像: CentOS-7.0-1406-x86_64-DVD.iso 我打包好放这了&#xff0c;VMware 和 CentOS7 &#xff0c;下载即可。 关于VMware Workstation Pro 17.6.3&#xff0c;傻瓜式安装即可。 CentO…...

关于高并发GIS数据处理的一点经验分享

1、背景介绍 笔者过去几年在参与某个大型央企的项目开发过程中,遇到了十分棘手的难题。其与我们平常接触的项目性质完全不同。在一般的项目中,客户一般只要求我们能够通过桌面软件对原始数据进行加工处理,将各类地理信息数据加工处理成地图/场景和工作空间,然后再将工作空…...

Python训练打卡Day22

复习日&#xff1a; 1.标准化数据&#xff08;聚类前通常需要标准化&#xff09; scaler StandardScaler() X_scaled scaler.fit_transform(X) StandardScaler() &#xff1a;这部分代码调用了 StandardScaler 类的构造函数。在Python中&#xff0c;当你在类名后面加上括号…...

Cold Diffusion: Inverting Arbitrary Image Transforms Without Noise论文阅读

冷扩散&#xff1a;无需噪声的任意图像变换反转 摘要 标准扩散模型通常涉及两个核心步骤&#xff1a;图像降质 &#xff08;添加高斯噪声&#xff09;和图像恢复 &#xff08;去噪操作&#xff09;。本文发现&#xff0c;扩散模型的生成能力并不强烈依赖于噪声的选择&#xf…...