• 利用blob对象实现大文件分片上传


      首先说分片上传,我们在进行文件上传的时候,因为服务器的限制,会限制每一次上传到服务器的文件大小不会很大,这个时候我们就需要把一个需要上传的文件进行切割,然后分别进行上传到服务器。

      假如需要做到这一步,我们需要解决两个问题:

    • 怎么切割?
    • 怎么得知当前传输的进度?

      首先解决怎么切割的问题。因为File文件对象是继承于Blob对象的,因此File文件对象也拥有slice这个方法,我们可以使用这个方法将任何一个File文件进行切割。

      slice用于文件分片上传:

      (1)分片与并发结合,将一个大文件分割成多块,并发上传,极大地提高大文件的上传速度。

      (2)当网络问题导致传输错误时,只需要重传出错分片,而不是整个文件。另外分片传输能够更加实时的跟踪上传进度。

      具体看代码:

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>upload</title>
        <script src="https://cdn.bootcss.com/jquery/3.2.1/jquery.min.js"></script>
    </head>
    <body>
        <input type="file" name="file" id="file">
        <button id="upload" onClick="upload()">upload</button>
        <script type="text/javascript">
            var bytesPerPiece = 1024 * 1024; // 每个文件切片大小定为1MB .
            var totalPieces;
            //发送请求
            function upload() {
                var blob = document.getElementById("file").files[0];
                var start = 0;
                var end;
                var index = 0;
                var filesize = blob.size;
                var filename = blob.name;
    
                //计算文件切片总数
                totalPieces = Math.ceil(filesize / bytesPerPiece);
                while(start < filesize) {
                    end = start + bytesPerPiece;
                    if(end > filesize) {
                        end = filesize;
                    } // 匹配最后一个分片的情况
    
                    var chunk = blob.slice(start,end);//切割文件    
                    var sliceIndex= blob.name + index;
                    var formData = new FormData();
                    formData.append("file", chunk, sliceIndex);
                    $.ajax({
                        url: 'http://localhost:9999/test.php',
                        type: 'POST',
                        cache: false,
                        data: formData,
                        processData: false,
                        contentType: false,
                    }).done(function(res){ 
    
                    }).fail(function(res) {
    
                    });
                    start = end;
                    index++;
                }
            }
        </script>
    </body>
    </html>

      此外还有常说的断点续传。

      说下简单思路:

      1、拿到文件,保存文件唯一标识,如md5;

      2、切割文件,分段上传;

      3、每次上传一段,根据唯一性标识判断文件上传进度,直到文件的全部片段上传完毕。

  • 相关阅读:
    tomcat自启动的最简单的方法
    Eclipse引入DTD文件
    MyBatis框架之基本知识介绍
    【转】Linux系统安装Redis详细过程
    Spring MVC + Spring + MyBatis 框架整合
    Spring框架之IoC和AOP
    Mysql 时间相关
    【转】Spring事务详解
    Spring的注解问题
    关于Calendar的一些用法总结
  • 原文地址:https://www.cnblogs.com/goloving/p/10439718.html
Copyright © 2020-2023  润新知