我们平时经常做的是上传文件,上传文件夹与上传文件类似,但也有一些不同之处,这次做了上传文件夹就记录下以备后用。

 

首先我们需要了解的是上传文件三要素:

1.表单提交方式:post (get方式提交有大小限制,post没有)

2.表单的enctype属性:必须设置为multipart/form-data. 

3.表单必须有文件上传项:file,且文件项需要给定name值

 

上传文件夹需要增加一个属性webkitdirectory,像这样:

<input id="fileFolder" name="fileFolder" type="file"  webkitdirectory>

部分文件块处理代码:

<%@ page language="java" import="up6.DBFile" pageEncoding="UTF-8"%>
<%@ page contentType="text/html;charset=UTF-8"%>
<%@ page import="up6.FileBlockWriter" %>
<%@ page import="up6.XDebug" %>
<%@ page import="up6.*" %>
<%@ page import="up6.biz.*" %>
<%@ page import="org.apache.commons.fileupload.FileItem" %>
<%@ page import="org.apache.commons.fileupload.FileItemFactory" %>
<%@ page import="org.apache.commons.fileupload.FileUploadException" %>
<%@ page import="org.apache.commons.fileupload.disk.DiskFileItemFactory" %>
<%@ page import="org.apache.commons.fileupload.servlet.ServletFileUpload" %>
<%@ page import="org.apache.commons.lang.*" %>
<%@ page import="java.net.URLDecoder"%>
<%@ page import="java.util.Iterator"%>
<%@ page import="net.sf.json.JSONObject"%>
<%@ page import="java.util.List"%>
<%
out.clear();
/*
	此页面负责将文件块数据写入文件中。
	此页面一般由控件负责调用
	参数:
		uid
		idSvr
		md5
		lenSvr
		pathSvr
		RangePos
		fd_idSvr
		fd_lenSvr
	更新记录:
		2012-04-12 更新文件大小变量类型,增加对2G以上文件的支持。
		2012-04-18 取消更新文件上传进度信息逻辑。
		2012-10-25 整合更新文件进度信息功能。减少客户端的AJAX调用。
		2014-07-23 优化代码。
		2015-03-19 客户端提供pathSvr,此页面减少一次访问数据库的操作。
		2016-04-09 优化文件存储逻辑,增加更新文件夹进度逻辑
		2017-07-13 取消数据库操作
		2017-10-23 增加删除文件块缓存操作
*/
//String path = request.getContextPath();
//String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";

String uid 			= request.getHeader("uid");//
String id 			= request.getHeader("id");
String lenSvr		= request.getHeader("lenSvr");
String lenLoc		= request.getHeader("lenLoc");
String blockOffset	= request.getHeader("blockOffset");
String blockSize	= request.getHeader("blockSize");
String blockIndex	= request.getHeader("blockIndex");
String blockMd5		= request.getHeader("blockMd5");
String complete		= request.getHeader("complete");
String pathSvr		= "";

//参数为空 
if(	 StringUtils.isBlank( uid )
	|| StringUtils.isBlank( id )
	|| StringUtils.isBlank( blockOffset ))
{
	XDebug.Output("param is null");
	return;
}
 
// Check that we have a file upload request
boolean isMultipart = ServletFileUpload.isMultipartContent(request);
FileItemFactory factory = new DiskFileItemFactory();   
ServletFileUpload upload = new ServletFileUpload(factory);
List files = null;
try 
{
	files = upload.parseRequest(request);
} 
catch (FileUploadException e) 
{// 解析文件数据错误  
    out.println("read file data error:" + e.toString());
    return;
   
}

FileItem rangeFile = null;
// 得到所有上传的文件
Iterator fileItr = files.iterator();
// 循环处理所有文件
while (fileItr.hasNext()) 
{
	// 得到当前文件
	rangeFile = (FileItem) fileItr.next();
	if(StringUtils.equals( rangeFile.getFieldName(),"pathSvr"))
	{
		pathSvr = rangeFile.getString();
		pathSvr = PathTool.url_decode(pathSvr);
	}
}

boolean verify = false;
String msg = "";
String md5Svr = "";
long blockSizeSvr = rangeFile.getSize();
if(!StringUtils.isBlank(blockMd5))
{
	md5Svr = Md5Tool.fileToMD5(rangeFile.getInputStream());
}

verify = Integer.parseInt(blockSize) == blockSizeSvr;
if(!verify)
{
	msg = "block size error sizeSvr:" + blockSizeSvr + "sizeLoc:" + blockSize;
}

if(verify && !StringUtils.isBlank(blockMd5))
{
	verify = md5Svr.equals(blockMd5);
	if(!verify) msg = "block md5 error";
}

if(verify)
{
	//保存文件块数据
	FileBlockWriter res = new FileBlockWriter();
	//仅第一块创建
	if( Integer.parseInt(blockIndex)==1) res.CreateFile(pathSvr,Long.parseLong(lenLoc));
	res.write( Long.parseLong(blockOffset),pathSvr,rangeFile);
	up6_biz_event.file_post_block(id,Integer.parseInt(blockIndex));
	
	JSONObject o = new JSONObject();
	o.put("msg", "ok");
	o.put("md5", md5Svr);	
	o.put("offset", blockOffset);//基于文件的块偏移位置
	msg = o.toString();
}
rangeFile.delete();
out.write(msg);
%>


工程截图
javaweb上传文件夹_javaweb上传文件夹javaweb上传文件夹_javaweb上传文件夹_02javaweb上传文件夹_javaweb上传文件夹_03
功能介绍

  

树形目录导航。您可以通过树型目录导航和路径导航栏快速跳转到指定目录。在跳转后树型目录将会自动选中当前的目录。

javaweb上传文件夹_javaweb上传文件夹_04

 

路径导航,点击根目录按钮便可返根目录

javaweb上传文件夹_java实现上传文件夹_05

 

文件和目录重命名

javaweb上传文件夹_javaweb上传文件夹_06 
 

点击删除按钮

javaweb上传文件夹_java实现上传文件夹_07

点击确定后,页面中的文件消失


 

 

 

批量上传文件

javaweb上传文件夹_java实现上传文件夹_08 
 

粘贴上传

复制文件夹、文件或图片

javaweb上传文件夹_java实现上传文件夹_09

在页面中选择好相应的上传目录,点击粘贴上传按钮,数据即可快速开始上传

javaweb上传文件夹_java实现上传文件夹_10


 

 

 

批量上传文件和文件夹

javaweb上传文件夹_javaweb上传文件夹_11 
 

 

文件和目录下载

javaweb上传文件夹_java实现上传文件夹_12

 

批量下载

同时选择多个需要下载的文件 

然后点击下载按钮,设置下载目录文件夹

javaweb上传文件夹_java实现上传文件夹_13


 

javaweb上传文件夹_javaweb上传文件夹_14

 

点击全部下载,开始下载

javaweb上传文件夹_java实现上传文件夹_15

 

自动加载未上传完的任务。在刷新浏览器或重启电脑后仍然可以自动加载未完成的任务。

javaweb上传文件夹_java实现上传文件夹_16

 

 

下载完成后打开我们设置的下载目录文件夹,发现需下载的文件或文件夹确认已下载成功,经确认文件夹内的内容与下载文件夹内容一致

javaweb上传文件夹_java实现上传文件夹_17

数据库记录,支持SQL、MySQL、Oracle

javaweb上传文件夹_javaweb上传文件夹_18javaweb上传文件夹_javaweb上传文件夹_19

javaweb上传文件夹_javaweb上传文件夹_20

 

控件包下载:
cab(x86):http://t.cn/Ai9pmG8S

cab(x64):http://t.cn/Ai9pm04B

xpi:http://t.cn/Ai9pubUc

crx:http://t.cn/Ai9pmrcy

exe:http://t.cn/Ai9puobe

 

示例下载:

jsp-eclipse:http://t.cn/Ai9p3LSx

jsp-myeclipse:http://t.cn/Ai9p3IdC

 

 

在线教程:

jsp-文件管理器教程:http://j.mp/2WJ2Y1m