首页 > 其他分享 >springboot 整合 gridfs 、webUploader实现大文件分块上传、断点续传、秒传

springboot 整合 gridfs 、webUploader实现大文件分块上传、断点续传、秒传

时间:2023-10-25 11:58:15浏览次数:42  
标签:function 断点续传 springboot 分块 webUploader uploader file 上传 find

主要的pom.xml:

<dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
<!--mongodb-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-mongodb</artifactId>
        </dependency>
<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
大家发现多了一个mysql,主要是为了在里面存文件列表用

resource目录如下:

application.properties:

替换成自己的用户名密码

pring.datasource.url=jdbc:mysql://127.0.0.1:3306/hrms?useUnicode=true&characterEncoding=utf8&useSSL=true&serverTimezone=GMT
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.jpa.database=mysql
#自动建表
spring.jpa.hibernate.ddl-auto=update
#设置数据库方言
spring.jpa.database-platform=org.hibernate.dialect.MySQL5InnoDBDialect
#打印sql
spring.jpa.show-sql=true
 
#连接mongodb
spring.data.mongodb.uri=mongodb://127.0.0.1:27017/mydb
spring.data.mongodb.username=root
spring.data.mongodb.password=123456
 

 前端upload.html:

进度条仅为测试,样式有点丑请忽略(webUploader官网的例子有点问题,需要自己调一下)

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <!--引入CSS-->
    <link rel="stylesheet" type="text/css" href="/css/webuploader.css">
    <!--引入JS-->
    <script type="text/javascript" src="/js/admin.js"></script>
    <script type="text/javascript" src="/js/jquery-3.3.1.min.js"></script>
    <script type="text/javascript" src="/js/webuploader.js"></script>
    <!--SWF在初始化的时候指定,在后面将展示-->
    <style>
        #ctlBtn {
            top: 0px;
            left: 0px;
            width: 94px;
            height: 40.8px;
            overflow: hidden;
            bottom: auto;
            right: auto;
        }
    </style>
</head>
<body>
<div id="uploader" class="wu-example">
    <!--用来存放文件信息-->
    <div id="thelist" class="uploader-list"></div>
    <div class="btns">
        <div id="picker">选择文件</div>
        <button id="ctlBtn" class="btn btn-default">开始上传</button>
    </div>
</div>
</body>
<script>
    var md5;
    //监听分块上传过程中的三个时间点
    WebUploader.Uploader.register({
        "before-send-file": "beforeSendFile",
        "before-send": "beforeSend",
        "after-send-file": "afterSendFile"
    }, {
        //时间点1:所有分块进行上传之前调用此函数
        beforeSendFile: function (file) {
            var deferred = WebUploader.Deferred();
            //1、计算文件的唯一标记,用于断点续传
            (new WebUploader.Uploader()).md5File(file, 0, 10 * 1024 * 1024)
                .progress(function (percentage) {
                    $('#' + file.id).find("p.state").text("正在读取文件信息...");
                })
                .then(function (val) {
                    md5 = val;
                    $('#' + file.id).find("p.state").text("成功获取文件信息...");
                    //获取文件信息后进入下一步
                    deferred.resolve();
                });
            return deferred.promise();
        },
        //时间点2:如果有分块上传,则每个分块上传之前调用此函数
        beforeSend: function (block) {
            var deferred = WebUploader.Deferred();
            $.ajax({
                type: "get",
                url: BASE_PATH + "/check",
                data: {
                    //文件唯一标记
                    "md5": md5,
                    //当前分块下标
                    "chunk": block.chunk,
                    //当前分块大小
                    "chunkSize": block.end - block.start
                },
                //无缓存
                cache: false,
                //无异步(必须加,否则异步上传会上传已经上传过的块)
                async: false,
                dataType: "json",
                success: function (data) {
                    if (data) {
                        //分块存在,跳过
                        deferred.reject();
                    } else {
                        //分块不存在或不完整,重新发送该分块内容
                        deferred.resolve();
                    }
                }
            });
 
            this.owner.options.formData.md5 = md5;
            deferred.resolve();
            return deferred.promise();
        }
        //时间点3:所有分块上传成功后调用此函数
        // afterSendFile: function () {
        //     //如果分块上传成功,则通知后台合并分块
        //     $.ajax({
        //         type: "POST",
        //         url: "<%=basePath%>Video?action=mergeChunks",
        //         data: {
        //             md5: md5,
        //         },
        //         success: function (response) {
        //             alert("上传成功");
        //             var path = "uploads/" + md5 + ".mp4";
        //             $("#item1").attr("src", path);
        //         }
        //     });
        // }
    });
    var uploader = WebUploader.create({
        // swf文件路径
        swf: BASE_PATH + "/js/Uploader.swf",
        // 文件接收服务端。
        server: BASE_PATH + "/upload",
        // 选择文件的按钮。可选。
        // 内部根据当前运行是创建,可能是input元素,也可能是flash.
        pick: "#picker",
        // 不压缩image, 默认如果是jpeg,文件上传前会压缩一把再上传!
        resize: false,
        //开启分片上传
        chunked: true,
        //分片大小
        chunkSize: 10 * 1024 * 1024,
        //并发数
        threads: 10
        //请求参数表
        // formData:datalist,
    });
 
    $("#ctlBtn").on("click", function () {
        uploader.upload();
    });
 
    // 当有文件被添加进队列的时候
    uploader.on('fileQueued', function (file) {
        $("#thelist").append("<div id=\"" + file.id + "\" class=\"item\">" +
            "<h4 class=\"info\">" + file.name + "</h4>" +
            "<p class=\"state\">等待上传...</p>" +
            "</div>");
        // //暂停上传的文件
        // $("#thelist").on('click', '.stop', function () {
        //     uploader.stop(true);
        // }),
        // //删除上传的文件
        // $("#thelist").on('click', '.remove', function () {
        //     if ($(this).parents(".item").attr('id') === file.id) {
        //         uploader.removeFile(file);
        //         $(this).parents(".item").remove();
        //     }
        // })
    });
 
    // 文件上传过程中创建进度条实时显示。
    uploader.on('uploadProgress', function (file, percentage) {
        var $li = $('#' + file.id);
        var $percent = $li.find('.progress .progress-bar');
 
        // 避免重复创建
        if (!$percent.length) {
            // $percent = $('<div class="progress progress-striped active">' +
            //     '<div class="progress-bar" role="progressbar" style="width: 0%">' +
            //     '</div>' +
            //     '</div>').appendTo($li).find('.progress-bar');
            $percent = $('<div class="progress progress-striped active">' +
                '<div class="progress-bar" role="progressbar" style="width: 0%">' +
                '</div>' +
                '</div>').appendTo($li).find('.progress');
        }
        $li.find('p.state').text('上传中');
        $percent.css({'width': percentage * 100 + '%', 'height': 10, 'background-color': 'blue'});
    });
 
 
    uploader.on('uploadSuccess', function (file) {
        $('#' + file.id).find('p.state').text('已上传');
    });
 
    uploader.on('uploadError', function (file) {
        $('#' + file.id).find('p.state').text('上传出错');
    });
 
    uploader.on('uploadComplete', function (file) {
        $('#' + file.id).find('.progress').fadeOut();
    });
 
</script>
</html>

 

参考文章:http://blog.ncmem.com/wordpress/2023/10/25/springboot-%e6%95%b4%e5%90%88-gridfs-%e3%80%81webuploader%e5%ae%9e%e7%8e%b0%e5%a4%a7%e6%96%87%e4%bb%b6%e5%88%86%e5%9d%97%e4%b8%8a%e4%bc%a0%e3%80%81%e6%96%ad%e7%82%b9%e7%bb%ad%e4%bc%a0%e3%80%81/

欢迎入群一起讨论

 

 

标签:function,断点续传,springboot,分块,webUploader,uploader,file,上传,find
From: https://www.cnblogs.com/songsu/p/17786784.html

相关文章

  • SpringBoot获取当前操作用户的id/信息
    一、概述在一般性的基设需求中,有需要获取当前用户操作记录的情况,也就是说我们需要记录当前用户的信息。如:id、昵称、账号等信息。这些信息一般用于记录用户的个人行为,例如:用户的操作日志,记录某些数据的更改或者添加者信息等。本例主要用于记录更改及添加者信息(操作......
  • SpringBoot实现对文件的断点续传和秒传
    本文断点续传文件思路:前端(客户端)需要根据固定大小对文件进行分片,请求后端(服务端)时要带上分片序号和大小;服务端创建conf文件用来记录分块位置,conf文件长度为总分片数,每上传一个分块即向conf文件中写入一个127,那么没上传的位置就是默认的0,已上传的就是Byte.MAX_VALUE127(这步是......
  • SpringBoot路径匹配
    Spring5.3之后加入了更多的请求路径匹配的实现策略;以前只支持AntPathMatcher策略,现在提供了PathPatternParser策略。并且可以让我们指定到底使用那种策略。1.Ant风格路径用法Ant风格的路径模式语法具有以下规则:*:表示任意数量的字符。?:表示任意一个字符。**:表示......
  • springboot生成二维码的正确姿势-附视频附源码
    @目录前言初始化SpringBoot项目引入依赖编码编写工具类生成二维码资源共享二维码的原理是什么,如何保证不重复?你有没有想过这样一件事,二维码是实现原理是什么?如何保证各个平台的二维码是唯一的?就算你的程序停止运行,但是你的二维码依然存在。设计上要保证唯一性,比如在物流等环......
  • springboot洗衣店管理系统-计算机毕业设计源码+LW文档
    摘 要随着时代的发展,人们的工作也学习压力越来越大,很多时候空闲时间也越来也少,经常没有时间去洗自己的衣服,很多商家在看到这种情况之后开设了洗衣机店专门用于服务这些没有时间洗衣服的人,但是传统的洗衣店都是用手动的的模式在管理,这种模式很落后,为了改善这一情况很多地方开设了......
  • SpringBoot 实现大文件上传下载、分片、断点续传教程
    WebUploader是由BaiduWebFE(FEX)团队开发的一个简单的以HTML5为主,FLASH为辅的现代文件上传组件。大文件上传实现思路:分片: 按照自定义缓冲区大小,将大文件分成多个小文件片段。断点续传: 根据分片数量,给每个小文件通过循环起对应名称,当文件下载中断在续传时,判断小文件名称若存在......
  • springboot日志配置
    目录logback知识链接......
  • Java:自定义实现SpringBoot Starter
    (目录)1、自定义Starter1.1、项目结构$tree.├──pom.xml└──src├──main│├──java││└──com││└──example││└──demo││├──ReadingConfiguration.java......
  • SpringBoot不再需要@Autowired来注入属性
    实操部分需要lombok依赖在对应需要注入属性的类上添加注解@RequiredArgsConstructor所有需要注入的属性改为final修饰为什么lombok的@RequiredArgsConstructor会生成一个有参(所有的用final修饰的属性)构造器spring的自动注入会直接根据有参构造器进行注入......
  • Gradle构建SpringBoot单模块项目
    Gradle构建SpringBoot单模块项目方式Ⅰ:未基于:GradleWrapper方式Ⅱ:(推荐使用)GradleWrapper【可以不安装Gradle、统一Gradle的版本】——包括Maven也是一样的可以用Wrapper的方式版本:JDK8+SpringBoot2.7.15+Gradle8.x本篇主要讲实现。Gradle与Maven的区别自己去看Ⅰ、普......