jQuery webuploader分片上传大文件

下面是关于“jQuery webuploader分片上传大文件”的完整攻略:

一、什么是jQuery webuploader分片上传大文件?

大文件上传在互联网应用中是经常遇到的需求之一。但是一般情况下,上传大文件往往需要很长的时间,并且容易造成上传失败的情况。而jQuery webuploader分片上传大文件就是一种解决方案,它能够将大文件切分成多个小片,逐个上传并在服务器端进行合并,从而实现大文件的快速、稳定上传。

二、具体的实现步骤

  1. 引入jQuery和webuploader插件:
<script src="https://cdn.bootcss.com/jquery/3.1.1/jquery.min.js"></script>
<!-- 引入webuploader插件 -->
<link rel="stylesheet" href="https://cdn.bootcss.com/webuploader/0.1.5/webuploader.css">
<script src="https://cdn.bootcss.com/webuploader/0.1.5/webuploader.min.js"></script>
  1. 创建上传容器和实例化webuploader对象:
<!-- 文件上传容器 -->
<div id="uploader">
    <div class="queueList">
        <div id="dndArea" class="placeholder">
            <div id="filePicker"></div>
            <p>或将文件拖到这里</p>
        </div>
    </div>
    <div class="statusBar" style="display:none;">
        <div class="progress">
            <span class="text">0%</span>
            <span class="percentage"></span>
        </div>
        <div class="info"></div>
        <div class="btns">
            <div id="filePicker2"></div>
            <div class="uploadBtn">开始上传</div>
        </div>
    </div>
</div>

<script>
// 实例化webuploader对象
var uploader = WebUploader.create({
    // 文件接收服务端。
    server: 'your_upload_url',
    // 是否分片上传,默认为true
    chunked: true,
    // 分片大小,如果不设置则默认为5M
    chunkSize: 5 * 1024 * 1024,
    // 最大同时上传的文件数,默认值:3。
    threads: 3,
    // 上传成功后的处理函数
    uploadSuccess: function(file, response) {
        console.log(response);
    }
});
</script>
  1. 监听文件添加事件,并进行分片上传:
// 文件添加事件
uploader.on('fileQueued', function(file) {
    // 当前文件总大小
    var totalSize = file.size,
        // 当前文件已上传的大小
        uploadedSize = 0;

    // 上传进度
    uploader.on('uploadProgress', function(file, percentage) {
        console.log('已上传:' + (totalSize * percentage) + '/' + totalSize);
    });

    // 分片上传
    uploader.on("uploadBeforeSend", function(block, data, headers) {
        console.log("上传的分片:" + block.chunk);
        data.chunkSize = block.end - block.start + 1;
        data.chunkIndex = block.chunk;
        data.chunkCount = block.chunks;
    });
});
  1. 实现断点续传功能:
// 记录已上传文件块信息
var uploadedBlocks = [];

// 恢复断点信息,如果服务器端支持断点续传的话
uploader.on("uploadStart", function(file) {
    $.get("your_resume_url", {
        filename: file.name
    }, function(resp) {
        uploadedBlocks = resp.uploadedBlocks || [];
        uploader.options.formData.resumeBlocks = JSON.stringify(uploadedBlocks);
        uploader.options.formData.filename = file.name;
        uploader.options.formData.filesize = file.size;
        uploader.options.formData.filetype = file.type;
        uploader.options.chunkRetry = 5;
        uploader.options.retryInterval = 10000;
    }, "json");
});

// 上传成功后记录已上传文件块信息,以便下次恢复
uploader.on("uploadSuccess", function(file, response) {
    if (response.code === 0) {
        var chunkIndex = response.chunkIndex;
        uploadedBlocks.push(chunkIndex);
    }
});

// 断点续传需特殊处理服务器返回的错误信息
uploader.on("uploadError", function(file, reason) {
    if (reason === "http") {
        var chunkSize = uploader.options.chunkSize;
        var block = Math.floor(this.getFile(file.id).size / chunkSize);
        var retry = uploadedBlocks.indexOf(block);
        if (retry < 0) {
            uploadedBlocks.push(block);
            this.retry();
        } else {
            uploadedBlocks.splice(retry, 1);
            alert("续传失败,请重新选择文件上传!");
        }
    } else {
        alert("上传出错:" + reason);
    }
});
  1. 注意事项:

  2. 分片大小要根据实际情况来设置,不能设置太小或太大。

  3. 要注意服务器端的代码是否支持断点续传,否则资源可能被覆盖。可以在上传时携带文件名、文件大小、文件类型等信息判断资源是否已经存在,避免覆盖文件。
  4. 文件上传过程中需做详细记录,如分片情况、已上传文件块信息等,以方便恢复和续传。
  5. 对于上传失败的文件块,需要重新上传,直到上传成功。

三、示例说明

  1. 示例1:基本分片上传

下面是一个基本的分片上传示例,实现了文件上传的基本功能。

// 实例化webuploader对象
var uploader = WebUploader.create({
    // 文件接收服务端。
    server: 'your_upload_url',
    // 是否分片上传,默认为true
    chunked: true
});

// 文件添加事件
uploader.on('fileQueued', function(file) {
    console.log('文件已添加:' + file.name);
});

// 开始上传
$('.uploadBtn').on('click', function() {
    uploader.upload();
});
  1. 示例2:断点续传的分片上传

下面是一个采用断点续传方式的分片上传示例,实现了上传进度条和断点续传功能,并对上传失败的文件块进行重试。

// 实例化webuploader对象
var uploader = WebUploader.create({
    // 文件接收服务端。
    server: 'your_upload_url',
    // 是否分片上传,默认为true
    chunked: true,
    // 分片大小,默认大小为5M
    chunkSize: 5 * 1024 * 1024,
    // 最大同时上传的文件数,默认值:3。
    threads: 3,
    // 上传成功后的处理函数
    uploadSuccess: function(file, response) {
        console.log(response);
    }
});

// 文件添加事件
uploader.on('fileQueued', function(file) {
    console.log('文件已添加:' + file.name);

    // 当前文件总大小
    var totalSize = file.size,
        // 当前文件已上传的大小
        uploadedSize = 0;

    // 上传进度
    uploader.on('uploadProgress', function(file, percentage) {
        console.log('已上传:' + (totalSize * percentage) + '/' + totalSize);
    });

    // 分片上传
    uploader.on("uploadBeforeSend", function(block, data, headers) {
        console.log("上传的分片:" + block.chunk);
        data.chunkSize = block.end - block.start + 1;
        data.chunkIndex = block.chunk;
        data.chunkCount = block.chunks;

        // 记录已上传文件块信息
        var uploadedBlocks = [];

        // 恢复断点信息,如果服务器端支持断点续传的话
        $.get("your_resume_url", {
            filename: file.name
        }, function(resp) {
            uploadedBlocks = resp.uploadedBlocks || [];
            uploader.options.formData.resumeBlocks = JSON.stringify(uploadedBlocks);
            uploader.options.formData.filename = file.name;
            uploader.options.formData.filesize = file.size;
            uploader.options.formData.filetype = file.type;
            uploader.options.chunkRetry = 5;
            uploader.options.retryInterval = 10000;
        }, "json");

        // 上传成功后记录已上传文件块信息,以便下次恢复
        uploader.on("uploadSuccess", function(file, response) {
            if (response.code === 0) {
                var chunkIndex = response.chunkIndex;
                uploadedBlocks.push(chunkIndex);
            }
        });

        // 断点续传需特殊处理服务器返回的错误信息
        uploader.on("uploadError", function(file, reason) {
            if (reason === "http") {
                var chunkSize = uploader.options.chunkSize;
                var block = Math.floor(this.getFile(file.id).size / chunkSize);
                var retry = uploadedBlocks.indexOf(block);
                if (retry < 0) {
                    uploadedBlocks.push(block);
                    this.retry();
                } else {
                    uploadedBlocks.splice(retry, 1);
                    alert("续传失败,请重新选择文件上传!");
                }
            } else {
                alert("上传出错:" + reason);
            }
        });
    });
});

// 开始上传
$('.uploadBtn').on('click', function() {
    uploader.upload();
});

以上就是关于“jQuery webuploader分片上传大文件”的完整攻略,包括了实现步骤和示例说明,希望能对你有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:jQuery webuploader分片上传大文件 - Python技术站

(0)
上一篇 2023年5月27日
下一篇 2023年5月27日

相关文章

  • 如何用jQuery找到所有带有hreflang属性的链接

    在jQuery中,我们可以使用选择器来找到所有带有hreflang属性的链接。以下是使用jQuery找到所有带有hreflang属性的链接的完整攻略: 步骤一:创建HTML结构 首先创建一个包含链接的HTML结构。以下是一个例子: <!DOCTYPE html> <html> <head> <title>Fin…

    jquery 2023年5月9日
    00
  • jQuery使用$.get()方法从服务器文件载入数据实例

    以下是详细的“jQuery使用$.get()方法从服务器文件载入数据实例”的攻略: 介绍 jQuery的$.get()方法可以帮助我们从服务器文件中获取数据,然后在前端页面进行展示或处理。$.get()方法可以使用HTTP GET请求发送给指定的URL,并且可以带有一些可选的参数。如果成功获取到了数据,就可以在回调函数中进行数据处理。 语法 $.get(ur…

    jquery 2023年5月27日
    00
  • jQWidgets jqxTreeGrid renderstatusbar属性

    以下是关于 jQWidgets jqxTreeGrid 组件中 renderstatusbar 属性的详细攻略。 jQWidgets jqxTreeGrid renderstatusbar 属性 jQWidgets jqxTreeGrid 组件 renderstatusbar 属性用于在 TreeGrid 控底添加自定义状态栏。状态栏可以包含文本、按钮、下拉…

    jquery 2023年5月12日
    00
  • jQWidgets jqxEditor可编辑属性

    jQWidgets jqxEditor可编辑属性详解 jQWidgets是一个基于jQuery的UI组件库,提供了丰富UI组件和工具包。jqxEditor是Widgets组件于实现富文本编辑器的组件。本文将详细介绍jqxEditor的editable属性,包括其作用、语法和示例。 jqxEditor editable属性的基本语法 jqxEditor的edi…

    jquery 2023年5月10日
    00
  • jQuery UI toggle()方法

    jQuery UI toggle()方法攻略 jQuery UI的toggle()方法是一个强大的JavaScript库,它提供了许多选项和功能,以便在元素之间切换时切换它们的可见性。以下是详细攻略,含两个示例,演示如何使用toggle()方法: 步骤1:引入库 在使用之前,需要先在中引入jQuery库和jQuery UI库。可以通过以下方式引入: <…

    jquery 2023年5月9日
    00
  • jQWidgets jqxDataTable rowDetails属性

    以下是关于“jQWidgets jqxDataTable rowDetails属性”的完整攻略,包含两个示例说明: 简介 jqxDataTable 控件的 rowDetails 属性用于在表格中显示行的详细信息。通过设置 rowDetails 属性,可以在表格中添加一个可展开的区域,用于显示行的详细信息,例如行的描述、图片等。 整攻 以下是 jqx 控 ro…

    jquery 2023年5月11日
    00
  • jQuery 1.5 源码解读 面向中高阶JSER

    jQuery 1.5 源码解读 面向中高阶JSER攻略 简介 在本攻略中,将介绍 jQuery 1.5 的源代码结构,以及它的核心功能。本攻略适合那些中高阶的 JSER。我们将深入了解 jQuery 1.5 的源代码,了解它的运作方式,以及如何将它用于我们的项目中。 jQuery 1.5 源码结构 jQuery 1.5 的源代码结构非常清晰,由以下几个主要模…

    jquery 2023年5月27日
    00
  • 当ID包含一个点字符时,如何在jQuery中使用ID选择html元素

    在jQuery中使用ID选择器时,如果ID包含点(.)字符,会被解析为一个class选择器。因此需要使用一个转义符(\)来对这个特殊字符进行转义,以正确地选择包含点的ID元素。 例如,在页面中有一个ID为”my.id”的元素,可以使用以下代码来选取该元素: $(‘#my\\.id’) 上述代码中,使用了两个反斜杠来转义”.”字符。这样选择器就会正确地选取ID…

    jquery 2023年5月12日
    00
合作推广
合作推广
分享本页
返回顶部