首页 > 编程语言 >Java大文件分片上传/多线程上传方案

Java大文件分片上传/多线程上传方案

时间:2023-05-26 18:23:36浏览次数:61  
标签:文件 Java 如下 编译 源码 多线程 上传 下载

 在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传和下载功能的实现。

先说下要求:

PC端全平台支持,要求支持Windows,Mac,Linux

支持所有浏览器。

支持文件批量上传

支持文件夹上传,且要求在服务端保留层级结构。文件夹数量要求支持到10W。

支持大文件断点续传,要求刷新浏览器,重启浏览器,重启电脑后仍然能够继续上传。文件大小要求能够支持到50个G。

支持自动加载本地文件,要求能够自动加载指定的本地文件。

支持文件批量下载,要求不要在服务器打包。因为50G的文件在服务器打包时间比较长。

支持文件夹下载,要求不要在服务器打包,下载到本地后要求保留层级结构

文件列表面板支持路径导航,新建文件夹

 

  对于文件上传,浏览器在上传的过程中是将文件以流的形式提交到服务器端的,如果直接使用Servlet获取上传文件的输入流然后再解析里面的请求参数是比较麻烦,所以一般选择采用apache的开源工具common-fileupload这个文件上传组件。这个common-fileupload上传组件的jar包可以去apache官网上面下载,也可以在struts的lib文件夹下面找到,struts上传的功能就是基于这个实现的。common-fileupload是依赖于common-io这个包的,所以还需要下载这个包。

一、开发环境搭建

  创建一个FileUploadAndDownLoad项目,加入Apache的commons-fileupload文件上传组件的相关Jar包,如下图所示:


 

依赖jar包如下


 

二、实现文件上传

前台HTML模板


 

文件块处理逻辑如下


 

保存文件块逻辑如下


web.xml配置如下


 

运行效果如下:


 

文件面板逻辑

前台代码


2.3、文件上传的细节

  上述的代码虽然可以成功将文件上传到服务器上面的指定目录当中,但是文件上传功能有许多需要注意的小细节问题,以下列出的几点需要特别注意的

1、为保证服务器安全,上传文件应该放在外界无法直接访问的目录下,比如放于WEB-INF目录下。

  2、为防止文件覆盖的现象发生,要为上传文件产生一个唯一的文件名。

  3、为防止一个目录下面出现太多文件,要使用hash算法打散存储。

  4、要限制上传文件的最大值。

  5、要限制上传文件的类型,在收到上传文件名时,判断后缀名是否合法。

  针对上述提出的5点细节问题,我们来改进一下UploadHandleServlet,改进后的代码如下:

文件数据表结构


文件夹数据表结构


下载数据表结构


针对上述提出的5点小细节问题进行改进之后,我们的文件上传功能就算是做得比较完善了。

三、文件下载

加载文件列表,注意,这里只列出上传完的文件和文件夹,没有上传完的就不列出了


数据库的处理逻辑比较简单,注意一下SQL语句中的条件即可


  我们要将Web应用系统中的文件资源提供给用户进行下载,首先我们要有一个页面列出上传文件目录下的所有文件,当用户点击文件下载超链接时就进行下载操作,编写一个ListFileServlet,用于列出Web应用系统中所有下载文件。

文件列表加载逻辑


       这里简单说一下ListFileServlet中listfile方法,listfile方法是用来列出目录下的所有文件的,listfile方法内部用到了递归,在实际开发当中,我们肯定会在数据库创建一张表,里面会存储上传的文件名以及文件的具体存放目录,我们通过查询表就可以知道文件的具体存放目录,是不需要用到递归操作的,这个例子是因为没有使用数据库存储上传的文件名和文件的具体存放位置,而上传文件的存放位置又使用了散列算法打散存放,所以需要用到递归,在递归时,将获取到的文件名存放到从外面传递到listfile方法里面的Map集合当中,这样就可以保证所有的文件都存放在同一个Map集合当中。

  编写一个用于处理文件下载的Servlet,DownLoadServlet的代码如下:

文件管理器主要逻辑如下:

文件管理器所有的逻辑都在PageFileMgr.java中实现。


另外,文件管理器有一些相关的配置在data目录下


系统配置数据如下


路径配置如下


文件管理器的脚本处理全部放在index.js中


关于JavaWeb中的文件上传和下载功能的内容就这么多。

效果展示:

 

视频演示:

windows控件安装,,linux-deb控件包安装,linux-rpm控件包安装,php7测试,php5测试,vue-cli-测试,asp.net-IIS测试,asp.net-阿里云(oss)测试,asp.net-华为云(obs)测试,jsp-springboot测试,ActiveX(x86)源码编译,ActiveX(x64)源码编译,Windows(npapi)源码编译,macOS源码编译,Linux(x86_64)源码编译,Linux(arm)源码编译,Linux(mips-uos)源码编译,Linux(mips-kylin-涉密环境)源码编译,sm4加密传输,压缩传输,

示例下载地址

源代码文档

asp.net源码下载jsp-springboot源码下载jsp-eclipse源码下载jsp-myeclipse源码下载php源码下载csharp-winform源码下载vue-cli源码下载c++源码下载

详细配置信息及思路

标签:文件,Java,如下,编译,源码,多线程,上传,下载
From: https://www.cnblogs.com/songsu/p/17435509.html

相关文章

  • 学习日记——Java循环结构
    1.while循环①语法:while循环语法//参数的初始化inti=1;//循环条件while(i<10){//循环操作System.out.println("这是测试");//变更参数i++;}特点:先判断,再执行②实战案例:2.dowhile循环①语法:dowhile语法 //初始化参数inti=0;do{......
  • java怎么打印一个对象的内存地址
    在Java一般使用HashCode来代表对象的地址,但是两个相同的对象就不行了,两个相同的对象的hashcode是相同的。  如果要对比两个相同的对象的地址可以使用,System.identityHashCode(传输进去的参数是一个对象)......
  • Java笔记(十):函数式接口
    函数式接口有且仅有一个抽象方法的接口JDK8中,只有一个抽象方法的接口称为函数式接口,我们就能使用Lambda。针对一个接口中,是否有大于一个抽象方法?JDK8为我们新增了一个注解:@FunctionalInterface。它能够帮助我们检测这个接口是不是只有一个抽象方法,如果有两个抽象方法,则会报......
  • Java大文件分片上传/多线程上传实例解析
    ​ javaweb上传文件上传文件的jsp中的部分上传文件同样可以使用form表单向后端发请求,也可以使用ajax向后端发请求    1. 通过form表单向后端发送请求         <formid="postForm" action="${pageContext.request.contextPath}/UploadServlet" method="pos......
  • Java笔记(九):线程池
    三大方法Executors.newSingleThreadExecutor();//单个线程Executors.newFixedThreadPool(5);//固定的线程池大小Executors.newCachedThreadPool();//可伸缩的以上底层都是由ThreadPoolExecutor实现阿里开发手册:线程池不允许使用Executors去创建,而是通过ThreadP......
  • 基于JAVA的虚拟页面置换算法
    访问【WRITE-BUG数字空间】_[内附完整源码和文档]一概述目的:实现OPT、FIFO、LRU三种置换算法。主要完成任务:实现三种算法并计算出每种算法的却页数,且以表格形式输出结果。使用开发工具:Eclipse—Java。解决主要问题:编写出可视化窗口输出运行结果。二使用的基本概念和原理OPT:在分配......
  • 如何在上架App之前设置证书并上传应用
    ​App上架教程在上架App之前想要进行真机测试的同学,请查看《iOS-最全的真机测试教程》,里面包含如何让多台电脑同时上架App和真机调试。P12文件的使用详解注意:同样可以在BuildSetting的sign中设置证书,但是有点麻烦,建议就在General中设置证书,比较方便,还可以查看错误的地方。......
  • 如何在上架App之前设置证书并上传应用
    ​App上架教程在上架App之前想要进行真机测试的同学,请查看《iOS-最全的真机测试教程》,里面包含如何让多台电脑同时上架App和真机调试。P12文件的使用详解注意:同样可以在BuildSetting的sign中设置证书,但是有点麻烦,建议就在General中设置证书,比较方便,还可以查看错误的地方。......
  • Java大文件分片上传/多线程上传源代码
    ​ 这里只写后端的代码,基本的思想就是,前端将文件分片,然后每次访问上传接口的时候,向后端传入参数:当前为第几块文件,和分片总数下面直接贴代码吧,一些难懂的我大部分都加上注释了:上传文件实体类:看得出来,实体类中已经有很多我们需要的功能了,还有实用的属性。如MD5秒传的信息。pub......
  • Java第四日
    今日份Java学习内容循环缘由与定义while循环结构调试程序do-while循环结构for循环  1.  循环缘由与定义     核心要点:在某种场景(多次重复做同一件事的情况)需要使用循环结构,特点:提高效率。 循环结构特点:1.循环条件(初始值、结束值)       ......