java+上传大文件

摘要:
支持批处理文件上载和文件夹上载,并且需要在服务器上保留层次结构。公共文件上传组件的jar包可以从Apache官方网站下载,也可以在struts的lib文件夹下找到。struts上传功能基于此。

在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包,如下图所示:

java+上传大文件第1张 

 

依赖jar包如下

java+上传大文件第2张

 

二、实现文件上传

前台HTML模板

java+上传大文件第3张

 

文件块处理逻辑如下

java+上传大文件第4张

 

保存文件块逻辑如下

java+上传大文件第5张

web.xml配置如下

java+上传大文件第6张

 

运行效果如下:

java+上传大文件第7张

 

文件面板逻辑

前台代码

java+上传大文件第8张

2.3、文件上传的细节

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

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

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

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

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

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

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

文件数据表结构

java+上传大文件第9张

文件夹数据表结构

java+上传大文件第10张

下载数据表结构

java+上传大文件第11张

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

三、文件下载

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

java+上传大文件第12张

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

java+上传大文件第13张

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

文件列表加载逻辑

java+上传大文件第14张

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

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

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

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

java+上传大文件第15张

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

java+上传大文件第16张

系统配置数据如下

java+上传大文件第17张

路径配置如下

java+上传大文件第18张

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

java+上传大文件第19张

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

最终实现的效果如下:

文件批量上传

java+上传大文件第20张

文件批量下载

java+上传大文件第21张

路径导航

java+上传大文件第22张

更详细教程可以参考我的这篇文章:http://blog.ncmem.com/wordpress/2019/08/12/java-web-%e8%83%bd%e5%a4%9f%e5%ae%9e%e7%8e%b0%e6%95%b4%e4%b8%aa%e6%96%87%e4%bb%b6%e5%a4%b9%e7%9a%84%e4%b8%8a%e4%bc%a0%e4%b8%8b%e8%bd%bd%e5%90%97%ef%bc%9f/

免责声明:文章转载自《java+上传大文件》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇v-for循环遍历,每次页面渲染发生改变,都会重新循环遍历一遍的问题解决!git commit 关闭eslint校验下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

上传大文件的解决方案

需求: 项目要支持大文件上传功能,经过讨论,初步将文件上传大小控制在20G内,因此自己需要在项目中进行文件上传部分的调整和配置,自己将大小都以20G来进行限制。 PC端全平台支持,要求支持Windows,Mac,Linux 支持所有浏览器。 支持文件批量上传 支持文件夹上传,且要求在服务端保留层级结构。文件夹数量要求支持到10W。 支持大文件断点续传,要求...

FastDFS分布式图片服务器搭建

一:Fastdfs简介 1. 什么是FastDFS FastDFS 是用 c 语言编写的一款开源的分布式文件系统。FastDFS 为互联网量身定制, 充分考虑了冗余备份、负载均衡、线性扩容等机制,并注重高可用、高性能等指标,使用 FastDFS 很容易搭建一套高性能的文件服务器集群提供文件上传、下载等服务。  FastDFS 架构包括 Tracker se...

FastDFS文件存储方案

FastDFS介绍 用c语言编写的一款开源的轻量级分布式文件系统。 功能包括:文件存储、文件访问(文件上传、文件下载)、文件同步等,解决了大容量存储和负载均衡的问题。特别适合以文件为载体的在线服务,如相册网站、视频网站等等。 为互联网量身定制,充分考虑了冗余备份、负载均衡、线性扩容等机制,并注重高可用、高性能等指标。 可以帮助我们搭建一套高性能的文件服务...

Python实例---基于页面的后台管理[简单版]

后台管理菜单 + 母板[css/content/js] 向后台提交数据[2种]: 1. 模态对话框(数据少操作,且Js复杂):form表单 :优点:简单,前端提交后后台处理完成后直接redirect;缺点:无法显示错误信息Ajax提交 : - 有错误,显示错误;无错误,通过js的 location.relad() 刷新页面- 有错误,显示错误;无错误,自...

CKediter

第一步:下载最新版CKeditor 第二步:解压并加入到项目中 第三步:添加到要使用到CKeditor的JSP页面   1、在头部引入相应的JS   2、在需要将textarea变成文本编辑器的地方添加JS 第四步:刷新页面展示 第五步:图片上传   1、显示图片上传TAB页   找到ckeditor_4.5.10_fullckeditorplu...

asp.net几种常见的文件上传、下载的方法

文件的上传下载是我们在实际项目开发过程中经常需要用到的技术,这里给出几种常见的方法,本文主要内容包括:1、如何解决文件上传大小的限制2、以文件形式保存到服务器3、转换成二进制字节流保存到数据库以及下载方法4、上传Internet上的资源第一部分:    首先我们来说一下如何解决ASP.NET中的文件上传大小限制的问题,我们知道在默认情况下ASP.NET的文...