0

0

js怎样实现文件分片上传 大文件分片上传与断点续传实战

下次还敢

下次还敢

发布时间:2025-06-25 10:19:01

|

781人浏览过

|

来源于php中文网

原创

文件分片上传通过将大文件切分为小块提升上传效率与稳定性。其核心实现步骤如下:1.前端使用filereader和slice()方法进行文件切割;2.利用fetch或xmlhttprequest逐个上传分片,并附带分片索引等元数据;3.通过localstorage记录已上传分片实现断点续传,后端需存储并验证分片状态;4.服务器接收所有分片后按序合并成完整文件;5.合理选择4mb-8mb的分片大小以平衡请求次数与失败率;6.上传失败时采用重试机制,设置最大重试次数与延迟间隔;7.监听上传进度事件实现ui实时反馈,从而优化用户体验。

js怎样实现文件分片上传 大文件分片上传与断点续传实战

文件分片上传,简单来说,就是把一个大文件切成很多小块,一块一块地传到服务器。这样做的好处显而易见:提升上传速度,降低单次上传失败的风险,还能实现断点续传。

js怎样实现文件分片上传 大文件分片上传与断点续传实战

js实现文件分片上传与断点续传,核心在于前端的文件切割、上传控制,以及后端的分片合并。

js怎样实现文件分片上传 大文件分片上传与断点续传实战

解决方案

  1. 前端文件切割: 使用FileReader API读取文件,然后用slice()方法将文件切割成指定大小的块。

    js怎样实现文件分片上传 大文件分片上传与断点续传实战
    async function sliceFile(file, chunkSize) {
        const chunks = [];
        let offset = 0;
        while (offset < file.size) {
            const chunk = file.slice(offset, offset + chunkSize);
            chunks.push(chunk);
            offset += chunkSize;
        }
        return chunks;
    }
  2. 上传分片: 使用XMLHttpRequestfetch API将每个分片上传到服务器。 每个分片都作为一个独立的请求发送。

    async function uploadChunk(chunk, fileId, chunkIndex, totalChunks) {
        const formData = new FormData();
        formData.append('file', chunk);
        formData.append('fileId', fileId);
        formData.append('chunkIndex', chunkIndex);
        formData.append('totalChunks', totalChunks);
    
        try {
            const response = await fetch('/upload', {
                method: 'POST',
                body: formData,
            });
    
            if (!response.ok) {
                throw new Error(`HTTP error! status: ${response.status}`);
            }
    
            const data = await response.json();
            return data; // 假设后端返回上传结果
        } catch (error) {
            console.error('上传分片失败:', error);
            throw error; // 向上抛出错误,便于后续处理
        }
    }
  3. 断点续传: 在上传过程中,记录已上传的分片信息。如果上传中断,下次可以从上次中断的位置继续上传。这需要后端配合,记录已上传的分片。前端也需要存储这些信息,例如使用localStorage

    极品模板多语言企业网站管理系统1.2.2
    极品模板多语言企业网站管理系统1.2.2

    【极品模板】出品的一款功能强大、安全性高、调用简单、扩展灵活的响应式多语言企业网站管理系统。 产品主要功能如下: 01、支持多语言扩展(独立内容表,可一键复制中文版数据) 02、支持一键修改后台路径; 03、杜绝常见弱口令,内置多种参数过滤、有效防范常见XSS; 04、支持文件分片上传功能,实现大文件轻松上传; 05、支持一键获取微信公众号文章(保存文章的图片到本地服务器); 06、支持一键

    下载
    // 示例:使用localStorage存储已上传的分片
    function saveUploadedChunk(fileId, chunkIndex) {
        let uploadedChunks = JSON.parse(localStorage.getItem(fileId) || '[]');
        uploadedChunks.push(chunkIndex);
        localStorage.setItem(fileId, JSON.stringify(uploadedChunks));
    }
    
    function getUploadedChunks(fileId) {
        return JSON.parse(localStorage.getItem(fileId) || '[]');
    }
  4. 后端分片合并: 服务器接收到所有分片后,按照分片顺序将它们合并成完整的文件。

如何选择合适的分片大小?

分片大小的选择直接影响上传效率和用户体验。 太小的分片会导致过多的请求,增加服务器压力;太大的分片则可能因为网络不稳定导致单次上传失败。一般来说,4MB-8MB是一个比较合适的范围。 实际应用中,可以根据网络环境和文件大小进行调整。

如何处理上传错误和重试机制?

上传过程中,网络波动、服务器故障等都可能导致上传失败。为了提高上传成功率,需要实现错误处理和重试机制。可以设置最大重试次数,每次重试之间增加一定的延迟。 超过最大重试次数后,可以提示用户稍后重试。

async function retryUpload(chunk, fileId, chunkIndex, totalChunks, maxRetries = 3, delay = 1000) {
    let retries = 0;
    while (retries < maxRetries) {
        try {
            return await uploadChunk(chunk, fileId, chunkIndex, totalChunks);
        } catch (error) {
            console.warn(`分片 ${chunkIndex} 上传失败,正在重试 (${retries + 1}/${maxRetries})...`);
            retries++;
            await new Promise(resolve => setTimeout(resolve, delay)); // 延迟一段时间后重试
        }
    }
    throw new Error(`分片 ${chunkIndex} 上传达到最大重试次数,上传失败。`);
}

如何实现上传进度的实时展示?

实时展示上传进度可以显著提升用户体验。 可以通过监听XMLHttpRequestprogress事件,或者fetch API返回的ReadableStream来获取上传进度。 将进度信息更新到UI界面上,让用户了解上传状态。

// 使用 fetch API 监听上传进度
async function uploadWithProgress(chunk, fileId, chunkIndex, totalChunks, progressCallback) {
    const formData = new FormData();
    formData.append('file', chunk);
    formData.append('fileId', fileId);
    formData.append('chunkIndex', chunkIndex);
    formData.append('totalChunks', totalChunks);

    const response = await fetch('/upload', {
        method: 'POST',
        body: formData,
        duplex: 'half', // 允许读取请求体
        signal: AbortSignal.timeout(60000) // 设置超时时间
    });

    if (!response.body) {
        throw new Error('Response body is empty.');
    }

    const reader = response.body.getReader();
    const contentLength = response.headers.get('Content-Length');
    let receivedLength = 0;

    while (true) {
        const { done, value } = await reader.read();

        if (done) {
            break;
        }

        receivedLength += value.length;
        const progress = contentLength ? receivedLength / Number(contentLength) : 0;
        progressCallback(progress); // 调用回调函数更新进度
    }

    if (!response.ok) {
        throw new Error(`HTTP error! status: ${response.status}`);
    }

    const data = await response.json();
    return data;
}

相关专题

更多
js正则表达式
js正则表达式

php中文网为大家提供各种js正则表达式语法大全以及各种js正则表达式使用的方法,还有更多js正则表达式的相关文章、相关下载、相关课程,供大家免费下载体验。

508

2023.06.20

js获取当前时间
js获取当前时间

JS全称JavaScript,是一种具有函数优先的轻量级,解释型或即时编译型的编程语言;它是一种属于网络的高级脚本语言,主要用于Web,常用来为网页添加各式各样的动态功能。js怎么获取当前时间呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

241

2023.07.28

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

249

2023.08.03

js是什么意思
js是什么意思

JS是JavaScript的缩写,它是一种广泛应用于网页开发的脚本语言。JavaScript是一种解释性的、基于对象和事件驱动的编程语言,通常用于为网页增加交互性和动态性。它可以在网页上实现复杂的功能和效果,如表单验证、页面元素操作、动画效果、数据交互等。

5224

2023.08.17

js删除节点的方法
js删除节点的方法

js删除节点的方法有:1、removeChild()方法,用于从父节点中移除指定的子节点,它需要两个参数,第一个参数是要删除的子节点,第二个参数是父节点;2、parentNode.removeChild()方法,可以直接通过父节点调用来删除子节点;3、remove()方法,可以直接删除节点,而无需指定父节点;4、innerHTML属性,用于删除节点的内容。

470

2023.09.01

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

205

2023.09.04

Js中concat和push的区别
Js中concat和push的区别

Js中concat和push的区别:1、concat用于将两个或多个数组合并成一个新数组,并返回这个新数组,而push用于向数组的末尾添加一个或多个元素,并返回修改后的数组的新长度;2、concat不会修改原始数组,是创建新的数组,而push会修改原数组,将新元素添加到原数组的末尾等等。本专题为大家提供concat和push相关的文章、下载、课程内容,供大家免费下载体验。

217

2023.09.14

js截取字符串的方法介绍
js截取字符串的方法介绍

JavaScript字符串截取方法,包括substring、slice、substr、charAt和split方法。这些方法可以根据具体需求,灵活地截取字符串的不同部分。在实际开发中,根据具体情况选择合适的方法进行字符串截取,能够提高代码的效率和可读性 。

216

2023.09.21

php源码安装教程大全
php源码安装教程大全

本专题整合了php源码安装教程,阅读专题下面的文章了解更多详细内容。

74

2025.12.31

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PHP基础入门课程
PHP基础入门课程

共33课时 | 1.9万人学习

Midjourney基础课程
Midjourney基础课程

共16课时 | 1.3万人学习

极致CMS零基础建站教学视频
极致CMS零基础建站教学视频

共62课时 | 5.3万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号