网站设计专业实验室建设/免费推广网站平台

网站设计专业实验室建设,免费推广网站平台,网站只有一个首页单页面怎么做排名,WordPress免费自动采集在前端开发中,断点续传是指在上传文件时,如果上传过程中中断(如网络断开、页面刷新等),可以从断点处继续上传,而不是重新上传整个文件。这种功能在大文件上传场景中非常有用。 以下是实现断点续传的思路和具…

在前端开发中,断点续传是指在上传文件时,如果上传过程中中断(如网络断开、页面刷新等),可以从断点处继续上传,而不是重新上传整个文件。这种功能在大文件上传场景中非常有用。
以下是实现断点续传的思路和具体步骤:

实现思路

文件分片:

将大文件分割成多个小文件块(chunk)。
每个文件块单独上传。

记录上传进度:

使用本地存储(如 localStorage)或服务端记录已上传的文件块。

断点续传:

在上传前检查已上传的文件块,跳过已上传的部分。
从未上传的部分开始继续上传。

合并文件:

所有文件块上传完成后,通知服务端合并文件。

实现步骤

1. 前端实现

以下是基于 React 和 Axios 的断点续传实现示例:

import React, { useState, useRef } from "react";
import axios from "axios";const chunkSize = 1024 * 1024; // 每个文件块的大小(1MB)const FileUpload = () => {const [file, setFile] = useState(null);const [progress, setProgress] = useState(0);const fileInputRef = useRef(null);// 处理文件选择const handleFileChange = (e) => {const selectedFile = e.target.files[0];setFile(selectedFile);};// 上传文件const handleUpload = async () => {if (!file) return;const totalChunks = Math.ceil(file.size / chunkSize); // 总文件块数let uploadedChunks = 0; // 已上传的文件块数// 检查已上传的文件块const uploadedChunksFromStorage = JSON.parse(localStorage.getItem(file.name) || []);for (let i = 0; i < totalChunks; i++) {// 如果当前文件块已上传,跳过if (uploadedChunksFromStorage.includes(i)) continue;const start = i * chunkSize;const end = Math.min(start + chunkSize, file.size);const chunk = file.slice(start, end); // 获取文件块const formData = new FormData();formData.append("file", chunk);formData.append("fileName", file.name);formData.append("chunkIndex", i);formData.append("totalChunks", totalChunks);try {await axios.post("/upload", formData, {headers: { "Content-Type": "multipart/form-data" },});// 更新已上传的文件块uploadedChunksFromStorage.push(i);localStorage.setItem(file.name, JSON.stringify(uploadedChunksFromStorage));// 更新上传进度uploadedChunks++;setProgress(Math.round((uploadedChunks / totalChunks) * 100));} catch (error) {console.error("上传失败", error);return;}}// 所有文件块上传完成后,通知服务端合并文件try {await axios.post("/merge", { fileName: file.name });alert("上传完成");localStorage.removeItem(file.name); // 清除本地存储的上传记录setProgress(0);fileInputRef.current.value = ""; // 清空文件输入} catch (error) {console.error("文件合并失败", error);}};return (<div><h1>文件断点续传</h1><input type="file" onChange={handleFileChange} ref={fileInputRef} /><button onClick={handleUpload}>上传</button><div>上传进度: {progress}%</div></div>);
};export default FileUpload;

2. 服务端实现

服务端需要支持文件块的上传和合并。以下是一个简单的 Node.js 实现示例:

const express = require("express");
const multer = require("multer");
const fs = require("fs");
const path = require("path");const app = express();
const upload = multer({ dest: "uploads/" });// 上传文件块
app.post("/upload", upload.single("file"), (req, res) => {const { fileName, chunkIndex } = req.body;const chunkPath = path.join("uploads", `${fileName}-${chunkIndex}`);// 将文件块保存到临时目录fs.renameSync(req.file.path, chunkPath);res.send({ message: "文件块上传成功" });
});// 合并文件块
app.post("/merge", (req, res) => {const { fileName } = req.body;const chunksDir = path.join("uploads");const chunks = fs.readdirSync(chunksDir).filter((file) => file.startsWith(fileName)).sort((a, b) => a.split("-")[1] - b.split("-")[1]);// 创建可写流const writeStream = fs.createWriteStream(path.join("uploads", fileName));// 合并文件块chunks.forEach((chunk) => {const chunkPath = path.join(chunksDir, chunk);const readStream = fs.createReadStream(chunkPath);readStream.pipe(writeStream, { end: false });readStream.on("end", () => {fs.unlinkSync(chunkPath); // 删除已合并的文件块});});writeStream.on("finish", () => {res.send({ message: "文件合并成功" });});
});app.listen(3000, () => {console.log("服务端运行在 http://localhost:3000");
});

关键点解析

文件分片:

使用 File.slice() 方法将文件分割成多个块。
每个块单独上传。

记录上传进度:

使用 localStorage 记录已上传的文件块索引。
上传前检查已上传的文件块,跳过已上传的部分。

断点续传:

如果上传中断,重新上传时从未上传的文件块开始。

合并文件:

所有文件块上传完成后,通知服务端合并文件。
服务端按顺序读取文件块并写入目标文件。

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

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

相关文章

stable-diffusion-webui-docker 构建 comfy-ui

Ubuntu 安装 stable-diffusion-webui-docker 常见问题处理方法 这篇文章介绍了在 Ubuntu 上安装 stable-diffusion-webui-docker&#xff0c;运行 docker compose --profile auto up --build 构建出的界面是 stable-diffusion-webui&#xff0c;如果运行 docker compose --prof…

【AI学习从零至壹】Pytorch神经⽹络

Pytorch神经⽹络 神经网络简介神经元激活函数 神经网络神经⽹络的⼯作过程前向传播(forward) 反向传播(backward)训练神经⽹络 Pytorch搭建并训练神经⽹络神经⽹络构建和训练过程数据预处理构建模型优化器&提取训练数据训练样本 神经网络简介 神经元 在深度学习中&#x…

stm32 L432KC(mbed)入门第一课

目录 一. 前言 二. 专栏意义 三. MS入门第一课 一. 前言 新的一年MS课程又开始了&#xff0c;同时也到了该专栏的第三个年头。在前两年中&#xff0c;该专栏帮助了很多第一次接触单片机的同学。其中&#xff0c;有的同学订阅专栏是为了更好的完成并且通过MS这门课程&#xf…

【系统架构设计师】操作系统 - 文件管理 ② ( 位示图 | 空闲区域 管理 | 位号 | 字号 )

文章目录 一、空闲区域 管理1、空闲区域分配2、空闲区域 管理方式 简介 二、位示图 简介1、位示图 表示2、位示图 字号3、位示图 位号4、位示图 中 比特位 分组管理 三、位示图 考点1、计算磁盘 位示图 的大小2、位示图 位置计算 一、空闲区域 管理 1、空闲区域分配 在 索引文件…

搭建Django开发环境

搭建Django开发环境 文章目录 搭建Django开发环境[toc]一、安装Python语言环境二、安装Visual Studio Code三、安装setuptools工具四、安装Django框架 一、安装Python语言环境 1.测试当前系统环境是否存在Python语言解释器 python --version2.打开PowerShell终端&#xff0c;…

图论part3|101.孤岛的总面积、沉没孤岛、417. 太平洋大西洋水流问题

101. 孤岛的总面积 &#x1f517;&#xff1a;101. 孤岛的总面积思路&#xff1a;和昨天的岛的区别是&#xff1a;是否有挨着边的岛屿 所以可以先遍历四条边挨着的岛屿&#xff0c;把他们标记为非孤岛再计算其他岛屿当中的最大面积 代码&#xff1a;&#xff08;深度搜索&…

AP AR

混淆矩阵 真实值正例真实值负例预测值正例TPFP预测值负例FNTN &#xff08;根据阈值预测&#xff09; P精确度计算&#xff1a;TP/(TPFP) R召回率计算&#xff1a;TP/(TPFN) AP 综合考虑P R 根据不同的阈值计算出不同的PR组合&#xff0c; 画出PR曲线&#xff0c;计算曲线…

【css酷炫效果】纯CSS实现按钮流光边框

【css酷炫效果】纯CSS实现按钮流光边框 缘创作背景html结构css样式完整代码效果图 【css酷炫效果】纯CSS实现按钮流光边框。 想直接拿走的老板&#xff0c;链接放在这里&#xff1a;https://download.csdn.net/download/u011561335/90490501 缘 创作随缘&#xff0c;不定时更…

【Android】ListView控件在进入|退出小窗下的异常

1&#xff0c;描述 页面使用了ListView控件&#xff0c;随后进入小窗模式&#xff0c;导致视图遮挡 2&#xff0c;根源 ListView虽然进入小窗relayout&#xff0c;其measureChild高度比全屏下要小&#xff0c;但是&#xff0c;其内部使用了Recycler机制&#xff0c;缓存了ite…

基于ssm的电子病历系统(全套)

一、系统架构 前端&#xff1a;jsp | bootstrap | jquery 后端&#xff1a;spring | springmvc | mybatis 环境&#xff1a;jdk1.8 | mysql | maven | tomcat | idea 二、代码及数据库 三、功能介绍 01. 登录 02. 主页 03. 管理员-个人中心-修改密码…

使用STM32CubeMX+DMA+空闲中断实现串口接收和发送数据(STM32G070CBT6)

1.STM32CubeMX配置 &#xff08;1&#xff09;配置SYS &#xff08;2&#xff09;配置RCC &#xff08;3&#xff09;配置串口&#xff0c;此处我用的是串口4&#xff0c;其他串口也是一样的 &#xff08;4&#xff09;配置DMA&#xff0c;将串口4的TX和RX添加到DMA中 &#…

LabVIEW VI Scripting随机数波形图自动生成

通过LabVIEW VI Scripting 技术&#xff0c;实现从零开始编程化创建并运行一个随机数波形监测VI。核心功能包括自动化生成VI框架、添加控件与函数、配置数据流逻辑及界面布局优化&#xff0c;适用于批量生成测试工具、教学模板开发或复杂系统的模块化构建。通过脚本化操作&…

JavaScript 中的包装类型:概念、作用与使用场景

文章目录 引言1. 什么是包装类型&#xff1f;1.1 包装类型的定义1.2 包装类型的作用 2. 包装类型的使用2.1 自动装箱&#xff08;Autoboxing&#xff09;示例 2.2 手动创建包装对象示例 3. 包装类型的特性3.1 包装对象的生命周期示例 3.2 基本类型与包装对象的区别示例 4. 包装…

react18 核心知识点杂记1

类组件 如何渲染为真实dom 入口&#xff1a; const root ReactDOM.createRoot(document.getElementById(root))root.render(类组件)⬇️ 类组件内部render() {return (<div>12</div>)}⬇️ (经过babel-preset-react-app 把jsx语法&#xff0c;编译为h函数形式) R…

Matlab 汽车传动系统的振动特性分析

1、内容简介 Matlab 186-汽车传动系统的振动特性分析 可以交流、咨询、答疑 2、内容说明 略 摘要&#xff1a;汽车动力传动系统是一个具有多自由度的、连续的、有阻尼系统。传动系统的振动主要有横向振动、扭转振动、纵向振动。并且汽车传动系统的扭转振动是一个非常重要的振…

JDBC技术基础

文章目录 1. JDBC概述1.1 数据的持久化1.2 Java中的数据存储技术1.3 JDBC介绍1.4 JDBC体系结构1.5 JDBC程序编写步骤 2. 获取数据库连接2.1 引入JAR包2.2 要素一&#xff1a;Driver接口实现类2.2.1 Driver接口介绍2.2.2 加载与注册JDBC驱动 2.3 要素二&#xff1a;URL2.4 要素三…

QT入门笔记2

目录 一、前言 二、串口助手实现 2.1、串口 2.1.1、可用串口信息-QSerialPortInfo 2.1.2、打开串口-QSerialPort 2.1.3、串口发送接收信息 2.2、定时器-QTimer 2.3、常用属性类型转换&#xff08;会更新&#xff09; 2.4、子控件组规则命名优化 一、前言 这个是学习Q…

Word 小黑第40套

对应大猫43 主题 -浏览主题 -选择W样式标准文件就行 1级段落和2级段落&#xff08;用项目符号不影响原本段落文字符号 颜色修改为自动&#xff09; 整段变红的 不是把光标定位到红色字体那里 要选择几个红色字体 再创建样式 插入的空白页一定要是下一页&#xff0c;不能插空白…

基于yolo11+flask打造一个精美登录界面和检测系统

这个是使用flask实现好看登录界面和友好的检测界面实现yolov11推理和展示&#xff0c;代码仅仅有2个html文件和一个python文件&#xff0c;真正做到了用最简洁的代码实现复杂功能。 测试通过环境&#xff1a; windows x64 anaconda3python3.8 ultralytics8.3.81 flask1.1.…

SQLMesh系列教程:利用date_spine宏构建日期序列实践指南

引言&#xff1a;为什么需要日期维度表&#xff1f; 在数据分析和报表开发中&#xff0c;日期维度表是不可或缺的基础结构&#xff0c;其中包括一定日期范围的日期序列&#xff0c;每个序列包括对应日期属性&#xff0c;如年季月日、是否周末等。无论是计算日粒度销售额、分析…