Java+Vue 断点续传功能实现

news/2024/12/25 15:57:49/

实现断点续传功能通常涉及前后端的协同工作。前端负责文件的分片上传和状态管理,后端负责接收文件分片并进行合并。下面是一个简单的示例,展示如何使用Java和Vue来实现断点续传功能。

前端(Vue)


1. 安装依赖


首先,确保你的Vue项目中安装了axios用于HTTP请求:

npm install axios

2. 创建文件上传组件


创建一个Vue组件来处理文件上传和断点续传逻辑:

<template><div><input type="file" @change="handleFileChange" /><button @click="uploadFile">Upload</button><button @click="pauseUpload">Pause</button><button @click="resumeUpload">Resume</button><div v-if="progress > 0">Progress: {{ progress }}%</div></div>
</template><script>
import axios from 'axios';export default {data() {return {file: null,chunks: [],chunkSize: 1024 * 1024, // 1MBcurrentChunk: 0,progress: 0,paused: false,};},methods: {handleFileChange(event) {this.file = event.target.files[0];this.chunks = this.createChunks(this.file);this.currentChunk = 0;this.progress = 0;this.paused = false;},createChunks(file) {const chunks = [];const totalChunks = Math.ceil(file.size / this.chunkSize);for (let i = 0; i < totalChunks; i++) {const start = i * this.chunkSize;const end = Math.min(file.size, start + this.chunkSize);chunks.push(file.slice(start, end));}return chunks;},async uploadFile() {if (!this.file) {alert('Please select a file first.');return;}for (; this.currentChunk < this.chunks.length; this.currentChunk++) {if (this.paused) {break;}const formData = new FormData();formData.append('file', this.chunks[this.currentChunk]);formData.append('chunkNumber', this.currentChunk);formData.append('totalChunks', this.chunks.length);formData.append('fileName', this.file.name);try {await axios.post('/api/upload', formData, {headers: {'Content-Type': 'multipart/form-data',},onUploadProgress: (progressEvent) => {const percentCompleted = Math.round((progressEvent.loaded * 100) / progressEvent.total);this.progress = ((this.currentChunk * 100) / this.chunks.length) + (percentCompleted / this.chunks.length);},});} catch (error) {console.error('Upload failed:', error);break;}}if (this.currentChunk === this.chunks.length) {alert('File uploaded successfully!');}},pauseUpload() {this.paused = true;},resumeUpload() {this.paused = false;this.uploadFile();},},
};
</script>

后端(Java)


1. 添加依赖


确保你的Spring Boot项目中添加了以下依赖:

<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>commons-io</groupId><artifactId>commons-io</artifactId><version>2.11.0</version></dependency>
</dependencies>

2. 创建文件上传控制器


创建一个控制器来处理文件分片上传和合并:

java">import org.apache.commons.io.FileUtils;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.UUID;@RestController
@RequestMapping("/api")
public class FileUploadController {private static final String UPLOAD_DIR = "uploads/";@PostMapping("/upload")public String uploadFile(@RequestParam("file") MultipartFile file,@RequestParam("chunkNumber") int chunkNumber,@RequestParam("totalChunks") int totalChunks,@RequestParam("fileName") String fileName,HttpServletRequest request) throws IOException {String tempDir = UPLOAD_DIR + UUID.randomUUID().toString() + "/";Path tempPath = Paths.get(tempDir);if (!Files.exists(tempPath)) {Files.createDirectories(tempPath);}String chunkFileName = fileName + ".part" + chunkNumber;File chunkFile = new File(tempDir + chunkFileName);file.transferTo(chunkFile);if (chunkNumber == totalChunks - 1) {mergeChunks(tempDir, fileName, totalChunks);FileUtils.deleteDirectory(new File(tempDir));}return "Chunk uploaded successfully";}private void mergeChunks(String tempDir, String fileName, int totalChunks) throws IOException {File outputFile = new File(UPLOAD_DIR + fileName);for (int i = 0; i < totalChunks; i++) {File chunkFile = new File(tempDir + fileName + ".part" + i);FileUtils.copyFile(chunkFile, outputFile, true);chunkFile.delete();}}
}

3. 配置文件


确保在application.properties中配置文件上传的大小限制:

spring.servlet.multipart.max-file-size=10MB
spring.servlet.multipart.max-request-size=10MB

4. 运行项目


启动Spring Boot应用和Vue前端应用,然后尝试上传一个大文件,测试断点续传功能。


总结


通过上述步骤,你可以在Java后端和Vue前端之间实现一个简单的断点续传功能。前端负责文件的分片上传和状态管理,后端负责接收文件分片并进行合并。希望这个示例对你有所帮助!


http://www.ppmy.cn/news/1558032.html

相关文章

SpringBoot3——Web开发

WebMvcAutoConfiguration原理 生效条件 AutoConfiguration(after { DispatcherServletAutoConfiguration.class, TaskExecutionAutoConfiguration.class,ValidationAutoConfiguration.class }) //在这些自动配置之后&#xff0c;再进行配置 ConditionalOnWebApplication(typ…

基于Spring Boot的高校素拓分管理系统

一、系统背景与目的 随着高校教育的不断发展&#xff0c;素质拓展活动在大学生培养中扮演着越来越重要的角色。为了更好地管理和记录学生的素质拓展学分&#xff0c;提高管理效率&#xff0c;降低管理成本&#xff0c;开发一套基于Spring Boot的高校素拓分管理系统显得尤为重要…

openGauss系列_Centos 7.6 使用 PTK v0.5 安装部署 MogDB v3.0.3 一主两备级联集群

一、安装环境准备 本次选择在集群环境规划的节点一节点使用PTK来部署MogDB集群&#xff0c;初期未创建omm数据库操作系统用户&#xff0c;通过PTK来创建omm用户及对应组。 本次部署一主两备环境&#xff0c;计划后期测试集群的增删节点。 1.1 硬件环境要求 根据MogDB官网信…

Go by Example学习

2024.12.21 000array slicemaprange函数结构体接口 参考资料&#xff1a; https://gobyexample-cn.github.io/ 000 package mainimport ("fmt""math" )const s string "constant"func main() {fmt.Println("hello world")var a &qu…

es 3期 第18节-分页查询使用避坑的一些事

#### 1.Elasticsearch是数据库&#xff0c;不是普通的Java应用程序&#xff0c;传统数据库需要的硬件资源同样需要&#xff0c;提升性能最有效的就是升级硬件。 #### 2.Elasticsearch是文档型数据库&#xff0c;不是关系型数据库&#xff0c;不具备严格的ACID事务特性&#xff…

ECharts散点图-气泡图,附视频讲解与代码下载

引言&#xff1a; ECharts散点图是一种常见的数据可视化图表类型&#xff0c;它通过在二维坐标系或其它坐标系中绘制散乱的点来展示数据之间的关系。本文将详细介绍如何使用ECharts库实现一个散点图&#xff0c;包括图表效果预览、视频讲解及代码下载&#xff0c;让你轻松掌握…

websocket的心跳检测和断线重连

心跳检测和断线重连可以通过WebSocket的事件和属性来实现。以下是一个简单的JavaScript示例&#xff0c;使用WebSocket API实现心跳检测和断线重连的功能&#xff1a; let ws;function connectWebSocket() {ws new WebSocket(ws://your-websocket-server-url);ws.onopen fun…

【uni-app】2025最新uni-app一键登录保姆级教程(包含前后端获取手机号方法)(超强避坑指南)

前言&#xff1a; 最近在配置uni-app一键登录时遇到了不少坑&#xff0c;uni-app的配套文档较为混乱&#xff0c;并且有部分更新的内容也没有及时更改在文档上&#xff0c;导致部分开发者跟着uni-app配套文档踩坑&#xff01;而目前市面上的文章质量也层次不齐&#xff0c;有的…