WebUploader,Java大文件分片上傳_第1頁
WebUploader,Java大文件分片上傳_第2頁
WebUploader,Java大文件分片上傳_第3頁
WebUploader,Java大文件分片上傳_第4頁
WebUploader,Java大文件分片上傳_第5頁
已閱讀5頁,還剩13頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、Web大文件分片上傳Web環(huán)境中大文件上傳不能再用form表單一次上傳了,這樣效率太低;我在不斷嘗試SpringMVC環(huán)境下分片接受文件,最終失??;原因目測是 SpringMVC、Struts框架是不支持HTML5方式上傳的(這類框架只能支持Form表單方式的文件上傳,或者FLash)那我們可以使用Servlet和SpringMVC結(jié)合集成方式實(shí)現(xiàn)大文件分片上傳;一、來看看我們的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',/ 文件接收服務(wù)端。server : 'UploadVideoServlet',/ 選擇文件的按鈕??蛇x。/ 內(nèi)部根據(jù)當(dāng)前運(yùn)行是創(chuàng)建,可能是input元素,也可能是flash.pick : '#picker',threads:2,chunked: true, /分片處理 chunkSize: 5 * 1024 * 1024, /每片5M threads:1,/上傳并發(fā)數(shù)。允許同時最大上傳進(jìn)程數(shù)。/ 不壓縮image, 默認(rèn)如果是jpeg,文件上傳前會壓縮一把再上傳!resize : false);/ 當(dāng)有文

7、件被添加進(jìn)隊(duì)列的時候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、創(chuàng)建一個文件上傳解析器ServletFileUpload upload = new ServletFileUpload(factory);/ 解決上傳文件名的中文亂碼upload.setHeaderEncoding(

17、"UTF-8");/ 3、判斷提交上來的數(shù)據(jù)是否是上傳表單的數(shù)據(jù)if (!ServletFileUpload.isMultipartContent(request) return;/ 4、使用ServletFileUpload解析器解析上傳數(shù)據(jù),解析結(jié)果返回的是一個List<FileItem>集合,每一個FileItem對應(yīng)一個Form表單的輸入項(xiàng)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() /* * 表單數(shù)據(jù) */String name = item.getFieldName();/ 解決普通輸入項(xiàng)的數(shù)據(jù)的中文亂碼問題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創(chuàng)建臨時文件夾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);/創(chuàng)建文件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上傳完畢觸發(fā)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請求中的分片數(shù)量可以用來校驗(yàn),獲取的分片是否正確,也可以前端傳遞md5,后臺校驗(yàn);五、后臺獲取的log圖:上傳的GUID命名的文件夾圖:文件夾下的分片文件每個分割線包住的地方是一個servlet請求,最后在success 請求的servlet是進(jìn)行文件校驗(yàn)并合并文件即可;代碼見下: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);/* * 進(jìn)行文件合并 */File file = new File(path+"/"+guid);/* * 判斷分片數(shù)量是否正確 */if(file.list().length != chunks)return;new File("F:/u

26、pload"+"/"+guid).mkdir();/* * 進(jìn)行文件合并 */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);/* * 當(dāng)所有追加寫入都寫完 才可以關(guān)閉流 */output

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論