WebUploader,Java大文件分片上传
更新时间:2023-12-22 23:19:01 阅读量: 教育文库 文档下载
Web大文件分片上传
Web环境中大文件上传不能再用form表单一次上传了,这样效率太低;
我在不断尝试SpringMVC环境下分片接受文件,最终失败;原因目测是 SpringMVC、Struts
框架是不支持HTML5方式上传的(这类框架只能支持Form表单方式的文件上传,或者FLash)
那我们可以使用Servlet和SpringMVC结合集成方式实现大文件分片上传;
一、来看看我们的web.xml的配置
很明显两个servlet,上面一个配置的是SpringMVC的入口,下面servlet是视频上传; 他们俩的url-pattern不能冲突;
二、先来看看WebUploader的前端代码
以下是代码:
<%@pagelanguage=\contentType=\
pageEncoding=\%>
Transitional//EN\\>
href=\${pageContext.request.scheme}://${pageContext.request.serverName}:${pageContext.request.serverPort}${pageContext.request.contextPath}/\>
Hello World!
选择文件
// swf文件路径
swf : 'webuploader/Uploader.swf', // 文件接收服务端。
server : 'UploadVideoServlet', // 选择文件的按钮。可选。
// 内部根据当前运行是创建,可能是input元素,也可能是flash. pick : '#picker', threads:2,
chunked: true, //分片处理
$(\).on('click', function() {
if ($(this).hasClass('disabled')) { }
uploader.options.formData.guid = Math.random(); uploader.upload();
returnfalse;
uploader.on('uploadComplete', function(file) {
$('#' + file.id).find('.progress').fadeOut(); });
uploader.on('uploadError', function(file) {
$('#' + file.id).find('p.state').text('上传出错');
function(data){
}, \);
});
});
三、servlet分片获取
分片就是前段将文件分成多个,每片都是一个post请求,有多少片就请求多少次servlet; 我们以获取的guid为文件名 建立临时文件夹,以chunk(片序号)为文件名来存储文件;
以下为代码: package com.airodlcx;
import java.io.File; import java.io.IOException;
import java.lang.reflect.InvocationTargetException; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map;
import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse;
import org.apache.commons.beanutils.BeanUtils; import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException; import org.apache.commons.fileupload.disk.DiskFileItemFactory; import org.apache.commons.fileupload.servlet.ServletFileUpload; import org.apache.commons.io.FileUtils; /**
* Servlet implementation class UploadVideo */
public class UploadVideoServlet extends HttpServlet {
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse * response) */
protected void doGet(HttpServletRequest request, HttpServletResponse response) }
throws ServletException, IOException {
/**
* @see HttpServlet#HttpServlet() */
public UploadVideoServlet() { }
super();
// TODO Auto-generated constructor stub private static final long serialVersionUID = 1L;
// TODO Auto-generated method stub
response.getWriter().append(\
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse * response) */
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String path = request.getSession().getServletContext().getRealPath(\System.out.println(path);
DiskFileItemFactory factory = new DiskFileItemFactory(); // 2、创建一个文件上传解析器
ServletFileUpload upload = new ServletFileUpload(factory); // 解决上传文件名的中文乱码 upload.setHeaderEncoding(\
// 3、判断提交上来的数据是否是上传表单的数据 if (!ServletFileUpload.isMultipartContent(request)) { }
// 4、使用ServletFileUpload解析器解析上传数据,解析结果返回的是一个
return;
List
List
list = upload.parseRequest(request);
} catch (FileUploadException e) { }
e.printStackTrace();
HashMap
System.out.println(\for (FileItem item : list) {
if (item.isFormField()) {
/**
* 表单数据 */
String name = item.getFieldName(); // 解决普通输入项的数据的中文乱码问题 String value = item.getString(\
// value = new String(value.getBytes(\System.out.println(name + \map.put(name, value);// 放入map集合
} else {
/**
* 文件上传
*/
File fileParent = new File(path + \以guid创建临时
文件夹
System.out.println(fileParent.getPath()); if (!fileParent.exists()) { }
String filename = item.getName();
if (filename == null || filename.trim().equals(\ }
// 注意:不同的浏览器提交的文件名是不一样的,有些浏览器提交上来
continue; fileParent.mkdir();
的文件名是带有路径的,如:
//创建文件 File file;
// c:\\a\\b\\1.txt,而有些只是单纯的文件名,如:1.txt
// 处理获取到的上传文件的文件名的路径部分,只保留文件名部分 filename = filename.substring(filename.lastIndexOf(\
}
}
}
}
if (map.get(\
file = new File(fileParent, map.get(\
} else { } //copy
FileUtils.copyInputStreamToFile(item.getInputStream(), file);
file = new File(fileParent, \
四、前端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(\, { \:
uploader.options.formData.guid,chunks:Math.ceil(file.size/(5*1024*1024)),fileName:file.name},
请求servlet去合并之前的guid文件夹下的分片文件,post请求中的分片数量可以用来校
function(data){
}, \);
});
验,获取的分片是否正确,也可以前端传递md5,后台校验;
五、后台获取的log
图:上传的GUID命名的文件夹
图:文件夹下的分片文件
每个分割线包住的地方是一个servlet请求,最后在success请求的servlet是进行文件校验并合并文件即可;代码见下: 六、java文件合并 代码见下:
protectedvoid doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println(\+guid+\+chunks+\
/**
* 进行文件合并 */
File file = new File(path+\+guid); /**
* 判断分片数量是否正确 */
if(file.list().length != chunks){ }
return;
Name=\+fileName);
String guid = request.getParameter(\);
intchunks = Integer.parseInt(request.getParameter(\)); String fileName = request.getParameter(\);
String path =
request.getSession().getServletContext().getRealPath(\);
new File(\+\+guid).mkdir(); /**
* 进行文件合并 */
File newFile = new File(\+\+guid+\+fileName); FileOutputStream outputStream = new FileOutputStream(newFile,
true);//文件追加写入
文件夹以guid命名,数据库储存guid的名字,后期数据移动,只需要更改前端显示的路径; 在这里up遇到一个问题,上传报错:IOException:磁盘空间不足;然而我上传的磁盘还有20G;原因是系统盘空间不足;up重装系统就好了; 注:
1、进度条的显示就很容易了
System.out.println(\+guid+\+chunks+\}
ame=\+fileName);
byte[] byt = newbyte[10*1024*1024]; intlen;
FileInputStream temp = null;//分片文件 for(inti = 0 ; i * 当所有追加写入都写完 才可以关闭流 */ outputStream.close(); temp.close(); temp = new FileInputStream(new File(path+\+guid+\+i)); while((len = temp.read(byt))!=-1){ } System.out.println(len); outputStream.write(byt, 0, len); 引入bootstrap的进度条 60% Complete now=\aria-valuemin=\aria-valuemax=\style=\width: 0%;\> 2.添加uploadProgress事件监听 uploader.on('uploadProgress', function(file,percentage) { $(\).css(\,parseInt(percentage*100)+\); }); percentage:当前上传的进度,小数,数值为1是上传完毕; 效果如下: PS:UI简陋还请见谅! 如果使用过程有问题,可以骚然我,QQ:346640094,Email:lcx1995@foxmail.com; 引入bootstrap的进度条 60% Complete now=\aria-valuemin=\aria-valuemax=\style=\width: 0%;\> 2.添加uploadProgress事件监听 uploader.on('uploadProgress', function(file,percentage) { $(\).css(\,parseInt(percentage*100)+\); }); percentage:当前上传的进度,小数,数值为1是上传完毕; 效果如下: PS:UI简陋还请见谅! 如果使用过程有问题,可以骚然我,QQ:346640094,Email:lcx1995@foxmail.com;
正在阅读:
军事理论课程考试试卷答案03-13
材料现代分析方法期末总结04-15
四川省情复习题及答案05-08
最高人民法院关于玉林市中级人民法院报请对东迅投资有限公司涉外仲裁一案不予执行的请示的复函01-27
2003年考研数学(一)试题及答案解析06-16
美德少年自我推荐词02-20
2003版验船师须知编写人员汇总表05-28
榕树下光影流年作文800字07-14
- exercise2
- 铅锌矿详查地质设计 - 图文
- 厨余垃圾、餐厨垃圾堆肥系统设计方案
- 陈明珠开题报告
- 化工原理精选例题
- 政府形象宣传册营销案例
- 小学一至三年级语文阅读专项练习题
- 2014.民诉 期末考试 复习题
- 巅峰智业 - 做好顶层设计对建设城市的重要意义
- (三起)冀教版三年级英语上册Unit4 Lesson24练习题及答案
- 2017年实心轮胎现状及发展趋势分析(目录)
- 基于GIS的农用地定级技术研究定稿
- 2017-2022年中国医疗保健市场调查与市场前景预测报告(目录) - 图文
- 作业
- OFDM技术仿真(MATLAB代码) - 图文
- Android工程师笔试题及答案
- 生命密码联合密码
- 空间地上权若干法律问题探究
- 江苏学业水平测试《机械基础》模拟试题
- 选课走班实施方案
- 分片
- WebUploader
- 上传
- 文件
- Java
- 在县九届人大一次会议闭幕式上的讲话
- 安全质量标准化示范工程施工创建过程 文档
- 朱军遗传学课后答案
- 中国人民大学金融硕士考研经验总结
- 多媒体课件评审标准
- 化工原理课程设计 - - 换热器
- 交通管理与控制重点
- 中国股市存在的问题及其应对措施
- 产纤维素酶菌种的筛选与优化
- 2018年中国煤制氢市场调研及调研报告目录
- 注册消防工程师 案例分析 2016真题
- 2015小学二年级品德全册教案 计划
- 中国钕铁硼材料行业市场调查研究报告(目录) - 图文
- 海运提单+发票+装箱单+保险单
- 经济学沙盘模拟实验报告(兰博基尼)
- 国内印刷杂志投稿邮箱及其方式
- 第2章 刚体的定轴转动2013.3.20
- 31个内科学经典病例分析
- 2018寒假实践报告范文
- (第二组文科)11学年花都区高二数学答案