书签 分享 收藏 举报 版权申诉 / 16

类型WebUploaderJava大文件分片上传.docx

  • 文档编号:25346647
  • 上传时间:2023-06-07
  • 格式:DOCX
  • 页数:16
  • 大小:353.49KB

20px20px20px0;">

选择文件

开始同步

三、servlet分片获取

分片就是前段将文件分成多个,每片都是一个post请求,有多少片就请求多少次servlet;

我们以获取的guid为文件名建立临时文件夹,以chunk(片序号)为文件名来存储文件;

以下为代码:

packagecom.airodlcx;

importjava.io.File;

importjava.io.IOException;

importjava.lang.reflect.InvocationTargetException;

importjava.util.ArrayList;

importjava.util.HashMap;

importjava.util.List;

importjava.util.Map;

importjavax.servlet.ServletException;

importjavax.servlet.http.HttpServlet;

importjavax.servlet.http.HttpServletRequest;

importjavax.servlet.http.HttpServletResponse;

importmons.beanutils.BeanUtils;

importmons.fileupload.FileItem;

importmons.fileupload.FileUploadException;

importmons.fileupload.disk.DiskFileItemFactory;

importmons.fileupload.servlet.ServletFileUpload;

importmons.io.FileUtils;

/**

*ServletimplementationclassUploadVideo

*/

publicclassUploadVideoServletextendsHttpServlet{

privatestaticfinallongserialVersionUID=1L;

/**

*@seeHttpServlet#HttpServlet()

*/

publicUploadVideoServlet(){

super();

//TODOAuto-generatedconstructorstub

}

/**

*@seeHttpServlet#doGet(HttpServletRequestrequest,HttpServletResponse

*response)

*/

protectedvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)

throwsServletException,IOException{

//TODOAuto-generatedmethodstub

response.getWriter().append("Servedat:

").append(request.getContextPath());

}

/**

*@seeHttpServlet#doPost(HttpServletRequestrequest,HttpServletResponse

*response)

*/

protectedvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)

throwsServletException,IOException{

Stringpath=request.getSession().getServletContext().getRealPath("/upload");

System.out.println(path);

DiskFileItemFactoryfactory=newDiskFileItemFactory();

//2、创建一个文件上传解析器

ServletFileUploadupload=newServletFileUpload(factory);

//解决上传文件名的中文乱码

upload.setHeaderEncoding("UTF-8");

//3、判断提交上来的数据是否是上传表单的数据

if(!

ServletFileUpload.isMultipartContent(request)){

return;

}

//4、使用ServletFileUpload解析器解析上传数据,解析结果返回的是一个List集合,每一个FileItem对应一个Form表单的输入项

Listlist=null;

try{

list=upload.parseRequest(request);

}catch(FileUploadExceptione){

e.printStackTrace();

}

HashMapmap=newHashMap();

System.out.println("-------------------------------------------------------------");

for(FileItemitem:

list){

if(item.isFormField()){

/**

*表单数据

*/

Stringname=item.getFieldName();

//解决普通输入项的数据的中文乱码问题

Stringvalue=item.getString("UTF-8");

//value=newString(value.getBytes("iso8859-1"),"UTF-8");

System.out.println(name+"="+value);

map.put(name,value);//放入map集合

}else{

/**

*文件上传

*/

FilefileParent=newFile(path+"/"+map.get("guid"));//以guid创建临时文件夹

System.out.println(fileParent.getPath());

if(!

fileParent.exists()){

fileParent.mkdir();

}

Stringfilename=item.getName();

if(filename==null||filename.trim().equals("")){

continue;

}

//注意:

不同的浏览器提交的文件名是不一样的,有些浏览器提交上来的文件名是带有路径的,如:

//c:

\a\b\1.txt,而有些只是单纯的文件名,如:

1.txt

//处理获取到的上传文件的文件名的路径部分,只保留文件名部分

filename=filename.substring(filename.lastIndexOf("\\")+1);

//创建文件

Filefile;

if(map.get("chunks")!

=null){

file=newFile(fileParent,map.get("chunk"));

}else{

file=newFile(fileParent,"0");

}

//copy

FileUtils.copyInputStreamToFile(item.getInputStream(),file);

}

}

}

}

四、前端WebUploader上传完毕触发uploadSuccess事件

uploader.on('uploadSuccess',function(file){

alert(uploader.options.formData.guid);

alert(Math.ceil(file.size/(5*1024*1024)));

alert(file.name);

$('#'+file.id).find('p.state').text('已上传');

$.post("UploadSuccessServlet",{"guid":

uploader.options.formData.guid,chunks:

Math.ceil(file.size/(5*1024*1024)),fileName:

file.name},

function(data){

},"json");

});

请求servlet去合并之前的guid文件夹下的分片文件,post请求中的分片数量可以用来校验,获取的分片是否正确,也可以前端传递md5,后台校验;

五、后台获取的log

图:

上传的GUID命名的文件夹

图:

文件夹下的分片文件

每个分割线包住的地方是一个servlet请求,最后在success请求的servlet是进行文件校验并合并文件即可;代码见下:

6、java文件合并

代码见下:

protectedvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{

Stringpath=request.getSession().getServletContext().getRealPath("/upload");

Stringguid=request.getParameter("guid");

intchunks=Integer.parseInt(request.getParameter("chunks"));

StringfileName=request.getParameter("fileName");

System.out.println("start...!

guid="+guid+";chunks="+chunks+";fileName="+fileName);

/**

*进行文件合并

*/

Filefile=newFile(path+"/"+guid);

/**

*判断分片数量是否正确

*/

if(file.list().length!

=chunks){

return;

}

newFile("F:

//upload"+"/"+guid).mkdir();

/**

*进行文件合并

*/

FilenewFile=newFile("F:

//upload"+"/"+guid+"/"+fileName);

FileOutputStreamoutputStream=newFileOutputStream(newFile,true);//文件追加写入

byte[]byt=newbyte[10*1024*1024];

intlen;

FileInputStreamtemp=null;//分片文件

for(inti=0;i

temp=newFileInputStream(newFile(path+"/"+guid+"/"+i));

while((len=temp.read(byt))!

=-1){

System.out.println(len);

outputStream.write(byt,0,len);

}

}

/**

*当所有追加写入都写完才可以关闭流

*/

outputStream.close();

temp.close();

System.out.println("success!

guid="+guid+";chunks="+chunks+";fileName="+fileName);

}

文件夹以guid命名,数据库储存guid的名字,后期数据移动,只需要更改前端显示的路径;

在这里up遇到一个问题,上传报错:

IOException:

磁盘空间不足;然而我上传的磁盘还有20G;原因是系统盘空间不足;up重装系统就好了;

注:

1、进度条的显示就很容易了

引入bootstrap的进度条

0%;">

60%Complete

2.添加uploadProgress事件监听

uploader.on('uploadProgress',function(file,percentage){

$("#progress").css("width",parseInt(percentage*100)+"%");

});

percentage:

当前上传的进度,小数,数值为1是上传完毕;

效果如下:

PS:

UI简陋还请见谅!

如果使用过程有问题,可以骚然我,QQ:

346640094,Email:

lcx1995@;

举报
举报
版权申诉
版权申诉
word格式文档无特别注明外均可编辑修改;预览文档经过压缩,下载后原文更清晰! 立即下载
配套讲稿:

如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。

特殊限制:

部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。

关 键  词:
WebUploaderJava 文件 分片 上传
提示  冰豆网所有资源均是用户自行上传分享,仅供网友学习交流,未经上传用户书面授权,请勿作他用。
关于本文
本文标题:WebUploaderJava大文件分片上传.docx
链接地址:https://www.bdocx.com/doc/25346647.html
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2008-2022 冰点文档网站版权所有

经营许可证编号:鄂ICP备2022015515号-1

收起
展开