技术驱动:探索SpringBoot的大文件上传策略

1.分片上传技术

为了处理大文件上传并保证性能,前后端可以使用分片上传(也称为分块上传)技术。

1.选择原因

分片上传(也称为分块上传)是一种处理大文件上传的技术,主要目的是提高上传的可靠性和效率。
网络稳定性和可靠性
断点续传:在上传大文件时,网络中断是一个常见的问题。如果没有分片上传,整个文件上传过程必须重新开始,这样不仅浪费时间,还增加了失败的可能性。而分片上传允许在网络恢复后从中断的地方继续上传,从而提高了上传的可靠性。
错误恢复:上传过程中,如果某个分片上传失败,只需重新上传这个分片,而不需要重新上传整个文件。
资源管理
内存消耗:上传大文件时,如果一次性读取整个文件,会占用大量内存,甚至可能导致内存溢出。而分片上传每次只读取和上传一个小块,内存消耗更可控。
带宽优化:分片上传可以更好地利用带宽资源,特别是在网络不稳定的情况下,分片上传可以避免带宽的浪费。
大文件支持
文件大小限制:一些浏览器和服务器对单个文件的上传大小有限制。通过分片上传,可以绕过这些限制,使上传大文件成为可能。
服务器处理压力:一次性上传大文件会给服务器带来很大的压力,分片上传可以减轻服务器的负担,因为服务器可以逐片处理和存储文件。

2.前端处理

1.文件分片:将大文件分成多个小块,每个块的大小可以根据需求设定。
2.上传分片:逐个上传分片,每个分片上传成功后上传下一个分片。
3.上传进度:可以通过计算已上传分片的大小来展示上传进度。
4.合并分片:所有分片上传完成后,通知后端合并分片。

3.后端处理

1.接收分片:后端接收每个分片并存储。
2.合并分片:在接收到所有分片后,将分片合并成完整文件。
3.处理上传进度和失败重传:记录上传进度,支持失败重传。

2.整合particles.js

particles.js 是一个轻量级的 JavaScript 库,用于在网页上创建交互性和美观的粒子效果。它能够生成各种各样的粒子动画,例如气泡、雪花、星星等,并且可以响应用户的鼠标移动和点击事件,增加网页的动态效果和吸引力。

1.主要特性

  • 轻量级particles.js 体积小,加载速度快。
  • 高效:使用 HTML5 的 canvas 元素进行渲染,性能优越。
  • 高度可定制:提供丰富的配置选项,可以自定义粒子的数量、颜色、形状、大小、速度等。
  • 交互性:支持鼠标事件,例如悬停和点击,从而实现粒子的交互效果。
  • 响应式:能够适应不同屏幕大小,确保在各种设备上的显示效果。

2.安装与使用

1. 引入 particles.js

你可以通过 CDN 或者下载文件的方式引入 particles.js

使用 CDN:

<!-- 使用 CDN 引入 -->
<script src="https://cdn.jsdelivr.net/particles.js/2.0.0/particles.min.js"></script>

下载文件:

你可以从 GitHub 下载 particles.js 文件,并将其放置在项目中,然后使用以下方式引用:

<script src="path/to/particles.min.js"></script>
2. 创建粒子容器

在 HTML 中创建一个容器,用于显示粒子效果:

<div id="particles-js"></div>
3. 初始化 particles.js

在 JavaScript 中初始化 particles.js 并进行配置:

<script>
particlesJS('particles-js', {"particles": {"number": {"value": 80,//粒子数量"density": {"enable": true,"value_area": 800 //粒子活动区域}},"color": {"value": "#333333" //粒子颜色},"shape": {"type": "circle", //粒子形状"stroke": { //粒子的描边"width": 0,"color": "#000000"},"polygon": {"nb_sides": 5}},"opacity": { //粒子透明度"value": 0.5,"random": false,"anim": {"enable": false, //是否开启"speed": 1,//动画速度"opacity_min": 0.1,"sync": false}},"size": {"value": 5,"random": true,"anim": {"enable": false,"speed": 40,"size_min": 0.1,"sync": false}},"line_linked": {//粒子之间的连线配置"enable": true,//是否开启连线"distance": 150,//连线距离"color": "#333333",//连线的颜色"opacity": 0.4,"width": 1 //连线宽度},"move": {"enable": true, //粒子是否移动"speed": 6,//粒子移动速度"direction": "none",//粒子移动方向"random": true,//是否随机移动"straight": false,//是否直线移动"out_mode": "out","bounce": false,//是否开启碰撞弹跳"attract": {"enable": false,"rotateX": 600,"rotateY": 1200}}},"interactivity": {"detect_on": "canvas","events": {"onhover": {//鼠标悬浮效果"enable": true,"mode": "repulse"},"onclick": {//鼠标点击效果"enable": true,"mode": "push"},"resize": true},"modes": {"grab": {"distance": 400,"line_linked": {"opacity": 1}},"bubble": {"distance": 400,"size": 40,"duration": 2,"opacity": 8,"speed": 3},"repulse": {"distance": 200,"duration": 0.4},"push": {"particles_nb": 4},"remove": {"particles_nb": 2}}},"retina_detect": true //是否启动视网膜屏检测});
</script>

3.配置选项

  • number: 粒子的数量及密度。
  • color: 粒子的颜色。
  • shape: 粒子的形状,可以是 circle(圆形)、edge(边缘)、triangle(三角形)、polygon(多边形)或 image(图片)。
  • opacity: 粒子的透明度。
  • size: 粒子的大小。

具体的配置可以在Github中查看,如下所示:
在这里插入图片描述

3.前端代码

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>File Upload with Particles.js Background</title><style>body {font-family: Arial, sans-serif;background-color: #f4f4f9;margin: 0;padding: 20px;display: flex;justify-content: center;align-items: center;height: 100vh;overflow: hidden;}.container {background-color: #fff;padding: 20px;border-radius: 8px;box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);text-align: center;z-index: 1;position: relative;}h1 {color: #333;}input[type="file"] {margin: 10px 0;}button {background-color: #007bff;color: #fff;border: none;padding: 10px 20px;border-radius: 4px;cursor: pointer;font-size: 16px;}button:hover {background-color: #0056b3;}progress {width: 100%;height: 20px;margin-top: 10px;border-radius: 4px;}#particles-js {position: absolute;width: 100%;height: 100%;top: 0;left: 0;z-index: 0;}</style><!-- 使用 CDN 引入 --><script src="https://cdn.jsdelivr.net/particles.js/2.0.0/particles.min.js"></script>
</head>
<body><div id="particles-js"></div><div class="container"><h1>File Upload</h1><input type="file" id="fileInput" /><button onclick="uploadFile()">Upload</button><progress id="progressBar" value="0" max="100"></progress></div><script>particlesJS('particles-js', {"particles": {"number": {"value": 80,//粒子数量"density": {"enable": true,"value_area": 800 //粒子活动区域}},"color": {"value": "#333333" //粒子颜色},"shape": {"type": "circle", //粒子形状"stroke": { //粒子的描边"width": 0,"color": "#000000"},"polygon": {"nb_sides": 5}},"opacity": { //粒子透明度"value": 0.5,"random": false,"anim": {"enable": false, //是否开启"speed": 1,//动画速度"opacity_min": 0.1,"sync": false}},"size": {"value": 5,"random": true,"anim": {"enable": false,"speed": 40,"size_min": 0.1,"sync": false}},"line_linked": {//粒子之间的连线配置"enable": true,//是否开启连线"distance": 150,//连线距离"color": "#333333",//连线的颜色"opacity": 0.4,"width": 1 //连线宽度},"move": {"enable": true, //粒子是否移动"speed": 6,//粒子移动速度"direction": "none",//粒子移动方向"random": true,//是否随机移动"straight": false,//是否直线移动"out_mode": "out","bounce": false,//是否开启碰撞弹跳"attract": {"enable": false,"rotateX": 600,"rotateY": 1200}}},"interactivity": {"detect_on": "canvas","events": {"onhover": {//鼠标悬浮效果"enable": true,"mode": "repulse"},"onclick": {//鼠标点击效果"enable": true,"mode": "push"},"resize": true},"modes": {"grab": {"distance": 400,"line_linked": {"opacity": 1}},"bubble": {"distance": 400,"size": 40,"duration": 2,"opacity": 8,"speed": 3},"repulse": {"distance": 200,"duration": 0.4},"push": {"particles_nb": 4},"remove": {"particles_nb": 2}}},"retina_detect": true //是否启动视网膜屏检测});const CHUNK_SIZE = 1024 * 1024; // 1MB per chunkasync function uploadFile() {const fileInput = document.getElementById('fileInput');const file = fileInput.files[0];const totalChunks = Math.ceil(file.size / CHUNK_SIZE);// 将大文件分片上传for (let i = 0; i < totalChunks; i++) {const start = i * CHUNK_SIZE;const end = Math.min(start + CHUNK_SIZE, file.size);const chunk = file.slice(start, end);const formData = new FormData();formData.append('chunkFile', chunk);formData.append('index', i);await fetch('http://127.0.0.1:8080/upload', {method: 'POST',body: formData});document.getElementById('progressBar').value = (i + 1) / totalChunks * 100;}// Notify server to merge chunksawait fetch('http://127.0.0.1:8080/merge', {method: 'POST',body: JSON.stringify({ fileName: file.name }),headers: { 'Content-Type': 'application/json' }});}</script>
</body>
</html>

对应的界面效果如下所示:

在这里插入图片描述

4.后端代码

1.创建一个SpringBoot项目(模块)

在这里插入图片描述
后面只需要导入Spring Web模块即可!
这里创建项目或者模块后,如果发现maven始终无法下载对应的依赖,那就需要更新maven的镜像仓库配置。
可以找到maven中的conf目录下的setting.xml文件,修改里面的mirror标签的内容,具体如下所示:

<mirror><!--This sends everything else to /public --><id>nexus-aliyun</id><mirrorOf>*</mirrorOf><name>Nexus aliyun</name><url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>

在这里插入图片描述

2.文件上传配置

需要在resources下的application.properties写一些配置项,来保证文件的正常上传等功能!具体如下所示:

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

3.控制层代码

这里在类的层级下通过 @CrossOrigin 设置的跨域,也可以通过写配置文件在全局设置跨域!

package com.xing.bigfileuploaddemo.controller;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.file.Files;
import java.util.Map;@RestController
@CrossOrigin
public class BigFileUploadController {// 获取资源文件夹的路径private static final String UPLOAD_DIR = System.getProperty("user.dir") + "/upload/";@GetMapping("/hello")public String hello(){return "hello BigFileUpload";}@PostMapping("/upload")public String uploadChunk(@RequestParam("chunkFile") MultipartFile chunkFile,@RequestParam("index") int index) {File uploadDir = new File(UPLOAD_DIR);if (!uploadDir.exists()) {uploadDir.mkdirs();}File file = new File(UPLOAD_DIR + "chunk_" + index);try {chunkFile.transferTo(file);} catch (IOException e) {throw new RuntimeException(e);}return ("Chunk " + index + " uploaded");}@PostMapping("/merge")public String mergeChunks(@RequestBody Map<String, String> request) throws FileNotFoundException {String filename = request.get("fileName");File mergedFile = new File(UPLOAD_DIR + filename);try (FileOutputStream fos = new FileOutputStream(mergedFile)) {for(int i=0;;i++){File chunkFile = new File(UPLOAD_DIR + "chunk_" + i);if(!chunkFile.exists()){break;}Files.copy(chunkFile.toPath(), fos);chunkFile.delete();}} catch (IOException e) {throw new RuntimeException(e);}return "File merged successfully";}
}

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

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

相关文章

论文导读 | 综述:大模型与推荐系统

最近&#xff0c;预训练语言模型&#xff08;PLM&#xff09;在自然语言处理领域取得了巨大成功&#xff0c;并逐渐引入推荐系统领域。本篇推文介绍了最近的两篇预训练语言模型和推荐系统结合的综述&#xff1a; [1] Pre-train, Prompt, and Recommendation: A Comprehensive …

华夏女中师生深入同仁堂,感悟中医药文化之精髓

华夏女中师生深入同仁堂&#xff0c;感悟中医药文化之精髓 2024年7月4日下午&#xff0c;北京师范大学实验华夏女子中学15名学生在薛艳老师的带领下来到北京同仁堂中医医院&#xff0c;开展职业影随活动。何泽扬院长对她们的到来表示欢迎。随后&#xff0c;在“冯建春全国名老中…

vue 模糊查询加个禁止属性

vue 模糊查询加个禁止属性 父组件通过属性传&#xff0c;是否禁止输入-------默认可以输入

Docker:三、安装nginx与tomcat

&#x1f341;安装常见服务 &#x1f332;安装nginx &#x1f9ca;1、搜索镜像 Ⅰ.hub docker上查询&#xff1a;https://hub.docker.com/_/nginx Ⅱ. 命令查询&#xff1a;docker search nginx &#x1f9ca;2、下载镜像 命令&#xff1a;docker pull nginx &#x1f9c…

软件测试面试题总结(超全的)

前面看到了一些面试题&#xff0c;总感觉会用得到&#xff0c;但是看一遍又记不住&#xff0c;所以我把面试题都整合在一起&#xff0c;都是来自各路大佬的分享&#xff0c;为了方便以后自己需要的时候刷一刷&#xff0c;不用再到处找题&#xff0c;今天把自己整理的这些面试题…

【Spring Boot】统一数据返回

目录 统一数据返回一. 概念二.实现统一数据返回2.1 重写responseAdvice方法2.2 重写beforeBodyWriter方法 三. 特殊类型-String的处理四. 全部代码 统一数据返回 一. 概念 其实统一数据返回是运用了AOP&#xff08;对某一类事情的集中处理&#xff09;的思维&#xff0c;简单…

Python自动化,实现自动登录并爬取商品数据,实现数据可视化

关于如何使用Python自动化登录天 猫并爬取商品数据的指南&#xff0c;我们需要明确这是一个涉及多个步骤的复杂过程&#xff0c;且需要考虑到天猫的反爬虫策略。以下是一个简化的步骤指南&#xff1a; 步骤一&#xff1a;准备工作 环境准备&#xff1a;确保你的Python环境已经…

《C语言》认识数据类型和理解变量

&#x1f339;个人主页&#x1f339;&#xff1a;喜欢草莓熊的bear &#x1f339;专栏&#x1f339;&#xff1a;C语言基础 目录 前言 一、数据类型的介绍 1.1 字符型 1.2 整形 1.3 浮点型 1.4 布尔类型 1.5 各种数据类型的长度 1.5.1 sizeof操作符 1.5.2 数据类型长度…

全端面试题15(canvas)

在前端开发领域&#xff0c;<canvas> 元素和相关的 API 是面试中经常被提及的主题。下面是一些常见的关于 HTML5 Canvas 的面试问题及解答示例&#xff1a; 1. 什么是 <canvas> 元素&#xff1f; <canvas> 是 HTML5 引入的一个用于图形渲染的标签。它本身并…

【Revit二次开发】创建rvt文件,但不打开Revit

介绍 需要安装Revit&#xff0c;但不用打开Revit加载插件&#xff0c;而是运行一个控制台应用&#xff0c;就可以创建一个rvt文件&#xff08;更多读写功能都可自行添加&#xff09;。 本文内容主要参考&#xff1a;博客1&#xff0c;但对内容进行了简化&#xff0c;只保留了…

PCL从理解到应用【03】KDTree 原理分析 | 案例分析 | 代码实现

前言 本文分析KDTree的原理&#xff0c;集合案例深入理解&#xff0c;同时提供源代码。 三个案例&#xff1a;K近邻搜索、半径内近邻搜索、近似最近邻搜索。方法对比&#xff0c;如下表所示&#xff1a; 特性K近邻搜索半径内近邻搜索近似最近邻搜索描述查找K个最近邻点查找指…

西安邀请媒体报道,附媒体名单

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 媒体宣传加速季&#xff0c;100万补贴享不停&#xff0c;一手媒体资源&#xff0c;全国100城线下落地执行。详情请联系胡老师。 西安市&#xff0c;作为中国古都之一&#xff0c;不仅拥有…

Astro新前端框架首次体验

Astro新前端框架首次体验 1、什么是Astro Astro是一个静态网站生成器的前端框架&#xff0c;它提供了一种新的开发方式和更好的性能体验&#xff0c;帮助开发者更快速地构建现代化的网站和应用程序。 简单来说就是&#xff1a;Astro这个是一个网站生成器&#xff0c;可以直接…

DisFormer:提高视觉动态预测的准确性和泛化能力

最新的研究进展已经显示出目标中心的表示方法在视觉动态预测任务中可以显著提升预测精度&#xff0c;并且增加模型的可解释性。这种表示方法通过将视觉场景分解为独立的对象&#xff0c;有助于模型更好地理解和预测场景中的变化。 尽管在静态图像的解耦表示学习方面已经取得了一…

基于SpringBoot的乐校园二手书交易管理系统

你好呀&#xff0c;我是计算机学姐码农小野&#xff01;如果有相关需求&#xff0c;可以私信联系我。 开发语言 Java 数据库 MySQL 技术 SpringBoot框架 工具 Visual Studio、MySQL数据库开发工具 系统展示 首页 用户注册界面 二手图书界面 个人中心界面 摘要 乐校园…

go Channel原理 (四)

Channel 设计原理 不要通过共享内存的方式进行通信&#xff0c;而是应该通过通信的方式共享内存。 在主流编程语言中&#xff0c;多个线程传递数据的方式一般都是共享内存。 Go 可以使用共享内存加互斥锁进行通信&#xff0c;同时也提供了一种不同的并发模型&#xff0c;即通…

试用笔记之-VB微信支付支付宝支付源代码

首先下载VB微信支付&支付宝支付源代码 http://www.htsoft.com.cn/download/VB6WeiXin_ZhiFuBao_ZhiFu.rar

【一念发动便是行】念头,就是命运

一个个恶念累积就是负能量&#xff0c;念头就是命运&#xff0c;克除恶念&#xff0c;防范念头&#xff0c;念头都有能量&#xff0c;学圣学须内外庄严检肃&#xff0c;言语有灵 多数人的问题都是出在念头上&#xff0c;念头&#xff0c;就是自己的命运&#xff1b; 当我们对自…

Linux--信号(万字详解!超完整!)

目录 0.预备知识 0.1.基本概念 0.2.信号的捕捉 0.3.理解信号的发送与保存 1.信号的产生&#xff08;阶段一&#xff09; 1.通过kill命令&#xff0c;向指定进程发送指定的信号 2.通过终端按键产生信号&#xff1a;ctrlc&#xff08;信号2&#xff09;&#xff0c;ctrl\(…

【python】PyQt5控件尺寸大小位置,内容边距等API调用方法实战解析

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…