首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

js 上传进度

在JavaScript中实现文件上传进度显示,通常涉及到HTML5的XMLHttpRequest对象或者使用Fetch API结合ReadableStream来监控上传进度。以下是相关的基础概念、优势、类型、应用场景以及如何实现上传进度的详细解释:

基础概念

上传进度:指文件从客户端传输到服务器的过程中,已传输的数据量占总数据量的比例。

优势

  1. 用户体验:让用户知道文件上传的状态,避免用户长时间等待而不知所措。
  2. 性能监控:开发者可以通过上传进度来监控和优化上传性能。

类型

  1. 基于XMLHttpRequest的上传进度:通过监听XMLHttpRequest对象的progress事件来实现。
  2. 基于Fetch API的上传进度:通过读取响应体的ReadableStream来实现。

应用场景

  • 文件上传功能
  • 视频上传
  • 大文件分片上传

实现方法

基于XMLHttpRequest的上传进度

代码语言:txt
复制
function uploadFile(file) {
    const xhr = new XMLHttpRequest();
    const formData = new FormData();
    formData.append('file', file);

    xhr.open('POST', '/upload', true);

    xhr.upload.addEventListener('progress', function(event) {
        if (event.lengthComputable) {
            const percentComplete = (event.loaded / event.total) * 100;
            console.log(`上传进度: ${percentComplete.toFixed(2)}%`);
        }
    });

    xhr.onload = function() {
        if (xhr.status === 200) {
            console.log('上传成功');
        } else {
            console.log('上传失败');
        }
    };

    xhr.send(formData);
}

基于Fetch API的上传进度

代码语言:txt
复制
async function uploadFileWithFetch(file) {
    const url = '/upload';
    const response = await fetch(url, {
        method: 'POST',
        body: file,
        headers: {
            'Content-Type': file.type
        }
    });

    if (!response.ok) {
        throw new Error('上传失败');
    }

    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 percentComplete = (receivedLength / contentLength) * 100;
        console.log(`上传进度: ${percentComplete.toFixed(2)}%`);
    }

    console.log('上传成功');
}

遇到的问题及解决方法

  1. progress事件不触发
    • 确保服务器端正确处理了文件上传请求。
    • 确保XMLHttpRequest对象的open方法中第三个参数设置为true(异步请求)。
  • 进度计算不准确
    • 确保event.lengthComputabletrue,即服务器返回了Content-Length头。
    • 对于大文件分片上传,需要分别计算每个分片的进度并累加。
  • 浏览器兼容性
    • Fetch API的进度监控在较新的浏览器中支持较好,对于旧版浏览器可以使用XMLHttpRequest

通过以上方法,可以在JavaScript中实现文件上传进度的监控,提升用户体验和开发效率。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

js文件异步上传进度条

进度条的应用是为了显示的告诉用户文件上传了多少,对于小文件的上传基本上应用不到进度条。...进度条主要应用于大文件的上传,在于告诉用户上传情况,不至于让用户无状态等待,增加了用户的体验,如果没有进度条,在上传过程中,用户不知道是不是卡死了,这种体验就很差了,下面我们来说一下如何在异步上传时显示进度条...其实无论是原生js写xhr,还是jq的ajax,还是axios的异步都提供了一个获取上传进度的API,首先我们来看一下原生js如何获取上传进度。...原生js获取上传进度 var fd = new FormData(); fd.append("file", document.getElementById('testFile').files[0]);...; } }); axios获取上传进度 在axios中提供了一个参数onUploadProgress,有了这个参数就可以很方便的获取上传进度了,其方法实现还是和原生js的一样,这个参数其实就是注册一个监听事件

10K20
  • js文件分片上传

    写在前面 今天我们写一下关于js的分片上传,因为工作中很多时候上传文件是比较大的,为了不让卡死,我们可以使用分片上传的方式进行文件的传输,下面就简单的将思路梳理一下,然后贴上代码 思路分析 既然是分片上传...,也就是说,假设一个文件的大小是10Mb,我们将其分为十份,每一份都按照前面所的完整的上传过程进行上传,然后循环十次即可将全部的都上传结束,这是我们的基本思路,下面我们贴上代码分析一下 源代码实现...fragmentAtionUpload 分片上传 * @params file 上传的文件 * @params cbUrl 上传的回调函数 * @params size 分片的大小...,他不管上传的大小,所以我们在循环的时候反复调用这个函数即可,最后是文件操作的函数就不多说了,总体来说最基本的分片上传还是比较简单的。...问题分析 这里有一个比较致命的问题,就是因为是分片上传,所以文件是被切成了一段一段的,那么就意味着如果上传的过程中因为网络或者别的原因中断了,那么问题就比较严重了,你可以选择重新上传,但是因为前面的一些片段已经上传上去了

    7.6K20
    领券