WebUploader,Java大文件分片上传_第1页
WebUploader,Java大文件分片上传_第2页
WebUploader,Java大文件分片上传_第3页
WebUploader,Java大文件分片上传_第4页
WebUploader,Java大文件分片上传_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、Web大文件分片上传Web环境中大文件上传不能再用form表单一次上传了,这样效率太低;我在不断尝试SpringMVC环境下分片接受文件,最终失败;原因目测是 SpringMVC、Struts框架是不支持HTML5方式上传的(这类框架只能支持Form表单方式的文件上传,或者FLash)那我们可以使用Servlet和SpringMVC结合集成方式实现大文件分片上传;一、来看看我们的web.xml的配置很明显两个servlet,上面一个配置的是SpringMVC的入口,下面servlet是视频上传;他们俩的url-pattern 不能冲突;二、先来看看WebUploader 的前端代码以

2、下是代码:<% page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%><!DOCTYPE html PUBLIC "-/W3C/DTD HTML 4.01 Transitional/EN" "/TR/html4/loose.dtd"><html><head><basehref="$pageCon

3、text.request.scheme:/$pageContext.request.serverName:$pageContext.request.serverPort$pageContext.request.contextPath/"><script type="text/javascript" src="webuploader/jquery-1.7.2.js"></script><script type="text/javascript" src="webuploader/w

4、ebuploader.min.js"></script><link href="webuploader/webuploader.css" type="css/text" /></head><body><h2>Hello World!</h2><div id="thelist" class="uploader-list"></div><div style="margin: 20px 20px

5、 20px 0;"><div id="picker" class="form-control-focus">选择文件</div></div><button id="btnSync" type="button" class="btn btn-warning">开始同步</button><script>var uploader = WebUploader.create(/ swf文件路径swf : 'we

6、buploader/Uploader.swf',/ 文件接收服务端。server : 'UploadVideoServlet',/ 选择文件的按钮。可选。/ 内部根据当前运行是创建,可能是input元素,也可能是flash.pick : '#picker',threads:2,chunked: true, /分片处理 chunkSize: 5 * 1024 * 1024, /每片5M threads:1,/上传并发数。允许同时最大上传进程数。/ 不压缩image, 默认如果是jpeg,文件上传前会压缩一把再上传!resize : false);/ 当有文

7、件被添加进队列的时候uploader.on('fileQueued', function(file) /alert(123);$("#thelist").append('<div id="' + file.id + '" class="item">'+ '<h4 class="info">' + + '</h4>'+ '<p class="state&quo

8、t;>等待上传.</p>' + '</div>'););uploader.on('uploadSuccess', function(file) alert(uploader.options.formData.guid);alert(Math.ceil(file.size/(5*1024*1024);alert();$('#' + file.id).find('p.state').text('已上传');$.post("UploadSuccessSer

9、vlet", "guid": uploader.options.formData.guid,chunks:Math.ceil(file.size/(5*1024*1024),fileName:, function(data) , "json"););uploader.on('uploadError', function(file) $('#' + file.id).find('p.state').text('上传出错'););uploader.on('up

10、loadComplete', function(file) $('#' + file.id).find('.progress').fadeOut(););$("#btnSync").on('click', function() if ($(this).hasClass('disabled') return false;uploader.options.formData.guid = Math.random();uploader.upload(););</script></body>

11、;</html>三、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

12、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 mons.beanutils.BeanUtils;import mons.fileupload.FileItem;import mons.fileupload.FileUpload

13、Exception;import mons.fileupload.disk.DiskFileItemFactory;import mons.fileupload.servlet.ServletFileUpload;import mons.io.FileUtils;/* * Servlet implementation class UploadVideo */public class UploadVideoServlet extends HttpServlet private static final long serialVersionUID = 1L;/* * see HttpServlet

14、#HttpServlet() */public UploadVideoServlet() super();/ TODO Auto-generated constructor stub/* * see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse * response) */protected void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException / TOD

15、O Auto-generated method stubresponse.getWriter().append("Served at: ").append(request.getContextPath();/* * see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse * response) */protected void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletExce

16、ption, IOException String path = request.getSession().getServletContext().getRealPath("/upload");System.out.println(path);DiskFileItemFactory factory = new DiskFileItemFactory();/ 2、创建一个文件上传解析器ServletFileUpload upload = new ServletFileUpload(factory);/ 解决上传文件名的中文乱码upload.setHeaderEncoding(

17、"UTF-8");/ 3、判断提交上来的数据是否是上传表单的数据if (!ServletFileUpload.isMultipartContent(request) return;/ 4、使用ServletFileUpload解析器解析上传数据,解析结果返回的是一个List<FileItem>集合,每一个FileItem对应一个Form表单的输入项List<FileItem> list = null;try list = upload.parseRequest(request); catch (FileUploadException e) e.pri

18、ntStackTrace();HashMap<String, String> map = new HashMap<String, String>();System.out.println("-");for (FileItem item : list) if (item.isFormField() /* * 表单数据 */String name = item.getFieldName();/ 解决普通输入项的数据的中文乱码问题String value = item.getString("UTF-8");/ value = new S

19、tring(value.getBytes("iso8859-1"),"UTF-8");System.out.println(name + "=" + value);map.put(name, value);/ 放入map集合 else /* * 文件上传 */File fileParent = new File(path + "/" + map.get("guid");/以guid创建临时文件夹System.out.println(fileParent.getPath();if (!filePa

20、rent.exists() fileParent.mkdir();String filename = item.getName();if (filename = null | filename.trim().equals("") continue;/ 注意:不同的浏览器提交的文件名是不一样的,有些浏览器提交上来的文件名是带有路径的,如:/ c:ab1.txt,而有些只是单纯的文件名,如:1.txt/ 处理获取到的上传文件的文件名的路径部分,只保留文件名部分filename = filename.substring(filename.lastIndexOf("&qu

21、ot;) + 1);/创建文件File file;if (map.get("chunks") != null) file = new File(fileParent, map.get("chunk"); else file = new File(fileParent, "0");/copyFileUtils.copyInputStreamToFile(item.getInputStream(), file);四、前端WebUploader上传完毕触发uploadSuccess事件uploader.on('uploadSucce

22、ss', function(file) alert(uploader.options.formData.guid);alert(Math.ceil(file.size/(5*1024*1024);alert();$('#' + file.id).find('p.state').text('已上传');$.post("UploadSuccessServlet", "guid": uploader.options.formData.guid,chunks:Math.ceil(file.

23、size/(5*1024*1024),fileName:, function(data) , "json"););请求servlet去合并之前的guid文件夹下的分片文件,post请求中的分片数量可以用来校验,获取的分片是否正确,也可以前端传递md5,后台校验;五、后台获取的log图:上传的GUID命名的文件夹图:文件夹下的分片文件每个分割线包住的地方是一个servlet请求,最后在success 请求的servlet是进行文件校验并合并文件即可;代码见下:6、 java文件合并代码见下:protected void doPost(HttpServletR

24、equest request, HttpServletResponse response) throws ServletException, IOException String path = request.getSession().getServletContext().getRealPath("/upload");String guid = request.getParameter("guid");int chunks = Integer.parseInt(request.getParameter("chunks");Strin

25、g fileName = request.getParameter("fileName");System.out.println("start.!guid="+guid+"chunks="+chunks+"fileName="+fileName);/* * 进行文件合并 */File file = new File(path+"/"+guid);/* * 判断分片数量是否正确 */if(file.list().length != chunks)return;new File("F:/u

26、pload"+"/"+guid).mkdir();/* * 进行文件合并 */File newFile = new File("F:/upload"+"/"+guid+"/"+fileName);FileOutputStream outputStream = new FileOutputStream(newFile, true);/文件追加写入byte byt = new byte10*1024*1024;int len;FileInputStream temp = null;/分片文件for(int i = 0 ; i<chunks ; i+)temp = new FileInputStream(new File(path+"/"+guid+"/"+i);while(len = temp.read(byt)!=-1)System.out.println(len);outputStream.write(byt, 0, len);/* * 当所有追加写入都写完 才可以关闭流 */output

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论