首页 > 其他分享 >同时上传多个文件实现,带进度条(完整代码)

同时上传多个文件实现,带进度条(完整代码)

时间:2024-01-20 22:02:37浏览次数:27  
标签:function 文件 return 进度条 代码 xhr var 上传


单文件上传

先简单来定义一个表单,注意加enctype=“multipart/form-data”,表示是上传组件

<form enctype="multipart/form-data" id="formData">
    MultipartFile:<input type="file" name="file" id="fileName1"/><br>
    <div id="progress">0%</div>
    <input id="submit" placeholder="提交"/>
</form>

定义js: 可能有的小伙伴会报错 FormData constructor: Argument 1 does not implement interface HTMLFormElement.原因是不能这样写var a = $("#formData");可能这和js底层代码有关,不能适配。不深究。

<script type="text/javascript">
    (function () {
        $("#submit").click(function () {
            upFiles();
        })

        function upFiles() {
            //不能这样写var a = $("#formData");
            var a = document.getElementById("formData");
            //封装成一个表单数据
            var formData = new FormData(a);
            $.ajax({
                //后端接口
                url: 'upFileOne',
                //上传的文件
                data: formData,
                //响应返回的结果类型
                datatype: 'json',
                //下面俩个参数加上
                processData: false,
                contentType: false,
                //异步请求才能显示进度
                async: true,
                //请求方式
                type: 'POST',
                //请求成功后的回调
                success: function (renponse) {
                    console.log("success" + renponse)
                },
                //请求失败后的回调
                error: function (error) {
                    console.log("error" + error)
                },
                //处理上传进度
                xhr: function () {
                    //ajax其实也就是对xhr的封装,这里自己设置底层的xhr
                    var xhr = $.ajaxSettings.xhr();
                    //给上传组件添加监听器 progress固定写法
                    xhr.upload.addEventListener('progress', function (evt) {
                        var loaded = evt.loaded;
                        var total = evt.total;
                        var percent = loaded / total * 100;
                        //显示进度
                        $('#progress').html(percent.toFixed(2) + "%");
                        //toFixed小数位是2位
                    }, false);
                    return xhr;
                }
            })
        }
    })()
</script>

后端用流来接收,没啥好说的。注意自己在c盘下面创建一个a1872文件夹,当然路劲可以改

/**
     * @param
     * @return
     * @function 上传文件,字节是逐个读取的
     */
    @Override
    public Boolean saveFile(MultipartFile multipartFile) {
        String originalFilename = multipartFile.getOriginalFilename();
        String path = "C:/a1872/" + originalFilename;
        FileOutputStream fileOutputStream = null;
        InputStream inputStream = null;
        try {
            inputStream = multipartFile.getInputStream();
            byte[] bytes = new byte[1024];
            int read = 0;
            fileOutputStream = new FileOutputStream(path);
            while (read != -1) {
                read = inputStream.read(bytes);
                fileOutputStream.write(read);
            }
        } catch (IOException e) {
            e.printStackTrace();
            return false;
        } finally {
            try {
                fileOutputStream.close();
                inputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return true;
    }

测试

同时上传多个文件实现,带进度条(完整代码)_vue


******************************************************************************************************


同时上传多个文件实现,带进度条(完整代码)_js_02

多文件上传

从请求中拿到所有的文件,逐个保存就行了。

/**
     * @param
     * @return
     * @function 上传多个文件
     */
    @PostMapping("/upFileMany")
    public String upFile(HttpServletRequest request) {
        //1:把请求转换为,多文件请求
        MultipartRequest multipartRequest = (MultipartRequest) request;
        //2:从中获取多文件上传的fileMap
        Map<String, MultipartFile> fileMap = multipartRequest.getFileMap();
        //3:获取多文件
        Collection<MultipartFile> multipartFiles = fileMap.values();
        for (MultipartFile file : multipartFiles) {
            fileI.saveFile(file);
        }
        return "upFileManyHtml";
    }

完整代码链接https://github.com/zhangzihang3/upfiles.git


标签:function,文件,return,进度条,代码,xhr,var,上传
From: https://blog.51cto.com/u_16414043/9346325

相关文章

  • redis实现延时队列(附完整代码)
    最近在复习所学过的队列的知识,像什么LinkedBlockingDeque。ArrayBlockingQueue,还有ribbitmq里的乱七八糟的,其本质我感觉啊这些技术就是一些队列,只不过大体上分为单机队列和分布式队列而已,当然本文的重点在于redis实现延时队列啊,可能有人会说,用ribbitmq这个专门的消息中间件实现延时......
  • 云计算-代码开发流水线及CCE容器集群使用案例
    总结自己在使用华为云商业CI/CD代码流水和CCE容器集群部署案例学无止尽啊新项目构建镜像使用华为codearts代码流水线,详细见官方文档https://support.huaweicloud.com/productdesc-devcloud/devcloud_pdtd_00000.html以部署report-service构建测试镜像为例dockerfile文件前端FRO......
  • 利用138译码器选择锁存器的逻辑及其代码
    比如要选择这个锁存器那么需要得到Y5C=1-->Y7=0WR=0WR默认为0通过138译码器选中Y7(138译码器输出为0的有效)138译码器输入口由P2高3位控制,但是我们写代码的时候只能控制这3位不能影响到其它口的状态(低5位状态保持不变),要不然会出错,由此需要用代码实现如下代码(想要只控制高3......
  • Tomcat_实现内嵌代码方式启动
    构建tomcat_maven项目可以从github上直接拉取tomcat_maven项目;也可以自己下载源码构建,这里贴一下tomcat8对应的pom.xml<?xmlversion="1.0"encoding="UTF-8"?><projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/20......
  • [译] kubernetes:kube-scheduler 调度器代码结构概述
    本文翻译自https://github.com/kubernetes/community/blob/master/contributors/devel/sig-scheduling/scheduling_code_hierarchy_overview.md译者:胡云Troy调度器代码层次结构概述介绍调度器监视新创建的还没有分配节点的Pod。当发现这样的Pod后,调度器将Pod调度到最......
  • 代码随想录 day25 组合总和Ⅲ 电话号码的字母组合
    组合总和Ⅲ跟组合总和Ⅰ很像这里固定了是1-9的范围而且确定了取k个数字那么就是确定了树的高度和宽度注意一下回溯的写法和边界条件就好还有剪枝操作如下其实就是当sum已经大于n就不需要再进行了电话号码的字母组合这题就是一般的回溯问题难点其实是在这投影怎么......
  • VisualStudioCode 代码对齐
    VisualStudioCode(简称VSCode)提供了多种方法来实现代码的对齐:1.内置对齐功能:通过快捷键`Shift+Alt+F`可以对当前选中文本进行对齐。这个方法适合于对单个区域进行快速对齐的情况。2.安装插件以实现自动对齐:VSCode有多个插件支持自动对齐功能,例如"Beautify"......
  • 代码之外:工程师的成长进阶秘籍
    程序员只懂技术能行吗? 为什么说技术人员“说”和“写”总得擅长一个? 你以为的“关注结果”是真的结果吗? 从一线工程师跃升团队管理者一共分几步? 在不断变化的职场环境中,技术人如何保持竞争力并实现自我增值,是摆在每个人面前的挑战。无论是一线工程师还是技术管理者,如......
  • 代码随想录 day24 回溯初体验
    组合熟悉一下回溯算法的基本流程以下是未曾进行剪枝处理的代码为什么要进行剪枝呢因为有一些情况是显然不可能成立的如下既然要取4个元素那么当取了1个元素之后集合剩余的元素不足4个不可能满足要求直接舍去具体边界思考路径剪枝代码如下......
  • TBK-RD8T3x 开发板 与1.77' 160(RGB)×128 代码
    TBK-RD8T3x开发板是一款基于增强型的高速1T8051内核的工业级集成触控按键功能的Flash微控制器。它支持多种通信接口,如GPIO、I2C、SPI等。以下是使用GPIO接口控制1.77'160(RGB)×128的代码:#include"tbkrd8t3x.h"voidmain(){//初始化TBK-RD8T3x开发板tbk_rd8t3x_in......