Plupload 是一個Web瀏覽器上的界面友好的文件上傳模塊,可顯示上傳進度、圖像自動縮略和上傳分塊。可同時上傳多個文件;javascript
上網找了不少Plupload的DEMO都沒法正常使用, 並且Plupload官方的DEMO是基於PHP, 折騰了半天, 寫了一個基於JAVA的DEMO;css
Plupload支持多種方式上傳, 包括,flash上傳(解決了不一樣服務器跨域的問題), html5方式上傳, html4上傳, silverlight的方式上傳, Plupload的核心是另一個JS庫:html
MOXIE, MOXIE提供了Plupload的運行環境, 也能夠單獨拿出來使用, 代碼量(體積)挺大的,MOXIE提供了下面幾種上傳環境: 前端
Plupload支持分塊上傳, 支持拖拽上傳, 支持圖片切塊, 支持30多種語言, 並且提供了豐富的API, 由於支持多種方式上傳, 能夠比較放心的使用這個JS插件;html5
容器是tomcat, 須要java的spring框架, 須要apache的幾個jar包, commons.fileupload等....;java
如下代碼是處理文件上傳的java代碼:jquery
package controller; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.ResourceBundle; import java.util.UUID; import javax.servlet.ServletConfig; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; 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; import org.apache.commons.io.FilenameUtils; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.ResponseBody; import com.alibaba.fastjson.JSON; @Controller public class mainController { String uploadPath; private static final ResourceBundle bundle = ResourceBundle.getBundle( "config" ); @RequestMapping(value="uploadFile.do", method=RequestMethod.POST) public void uploadFile( HttpServletRequest request, HttpServletResponse response ) throws IOException { response.setCharacterEncoding( "UTF-8" ); Integer chunk = null; /* 分割塊數 */ Integer chunks = null; /* 總分割數 */ String tempFileName = null; /* 臨時文件名 */ String newFileName = null; /* 最後合併後的新文件名 */ BufferedOutputStream outputStream = null; /* System.out.println(FileUtils.getTempDirectoryPath()); */ uploadPath = request.getServletContext().getRealPath( bundle.getString( "uploadPath" ) ); File up = new File( uploadPath ); if ( !up.exists() ) { up.mkdir(); } if ( ServletFileUpload.isMultipartContent( request ) ) { try { DiskFileItemFactory factory = new DiskFileItemFactory(); factory.setSizeThreshold( 1024 ); /* factory.setRepository(new File(repositoryPath));// 設置臨時目錄 */ ServletFileUpload upload = new ServletFileUpload( factory ); upload.setHeaderEncoding( "UTF-8" ); /* upload.setSizeMax(5 * 1024 * 1024);// 設置附件最大大小,超過這個大小上傳會不成功 */ List<FileItem> items = upload.parseRequest( request ); for ( FileItem item : items ) { if ( item.isFormField() ) /* 是文本域 */ { if ( item.getFieldName().equals( "name" ) ) { tempFileName = item.getString(); /* System.out.println("臨時文件名:" + tempFileName); */ } else if ( item.getFieldName().equals( "chunk" ) ) { chunk = Integer.parseInt( item.getString() ); /* System.out.println("當前文件塊:" + (chunk + 1)); */ } else if ( item.getFieldName().equals( "chunks" ) ) { chunks = Integer.parseInt( item.getString() ); /* System.out.println("文件總分塊:" + chunks); */ } } else { /* 若是是文件類型 */ if ( tempFileName != null ) { String chunkName = tempFileName; if ( chunk != null ) { chunkName = chunk + "_" + tempFileName; } File savedFile = new File( uploadPath, chunkName ); item.write( savedFile ); } } } newFileName = UUID.randomUUID().toString().replace( "-", "" ) .concat( "." ) .concat( FilenameUtils.getExtension( tempFileName ) ); if ( chunk != null && chunk + 1 == chunks ) { outputStream = new BufferedOutputStream( new FileOutputStream( new File( uploadPath, newFileName ) ) ); /* 遍歷文件合併 */ for ( int i = 0; i < chunks; i++ ) { File tempFile = new File( uploadPath, i + "_" + tempFileName ); byte[] bytes = FileUtils.readFileToByteArray( tempFile ); outputStream.write( bytes ); outputStream.flush(); tempFile.delete(); } outputStream.flush(); } Map<String, Object> m = new HashMap<String, Object>(); m.put( "status", true ); m.put( "fileUrl", bundle.getString( "uploadPath" ) + "/" + newFileName ); response.getWriter().write( JSON.toJSONString( m ) ); } catch ( FileUploadException e ) { e.printStackTrace(); Map<String, Object> m = new HashMap<String, Object>(); m.put( "status", false ); response.getWriter().write( JSON.toJSONString( m ) ); } catch ( Exception e ) { e.printStackTrace(); Map<String, Object> m = new HashMap<String, Object>(); m.put( "status", false ); response.getWriter().write( JSON.toJSONString( m ) ); } finally { try { if ( outputStream != null ) outputStream.close(); } catch ( IOException e ) { e.printStackTrace(); } } } } public void main() { } }
前端界面的主要代碼:git
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>plupload示例</title> <script src="http://cdn.bootcss.com/jquery/1.9.0/jquery.js"></script> <script type="text/javascript" src="${pageContext.request.contextPath}/js/plupload.full.min.js"></script> </head> <body> <div id="filelist"> </div> <button id="uploader">選擇文件</button> <div id="progress"></div> <div id="result"></div> </body> <script type="text/javascript"> var uploader = new plupload.Uploader({ runtimes : 'html5,flash,silverlight',//設置運行環境,會按設置的順序,能夠選擇的值有html5,gears,flash,silverlight,browserplus,html flash_swf_url : './js/Moxie.swf', silverlight_xap_url : './js/Moxie.xap', url : '${pageContext.request.contextPath}/uploadFile.do',//上傳文件路徑 max_file_size : '3gb',//100b, 10kb, 10mb, 1gb chunk_size : '1mb',//分塊大小,小於這個大小的不分塊 unique_names : true,//生成惟一文件名 browse_button : 'uploader', filters : [ { title : 'Image files', extensions : 'jpg,gif,png' }, { title : 'Zip files', extensions : 'zip,7z,rar' } ], init : { FilesAdded: function(up, files) { uploader.start(); return false; }, FileUploaded : function(up, file, info) {//文件上傳完畢觸發 console.log("單獨文件上傳完畢"); var response = $.parseJSON(info.response); if (response.status) { $('#result').append( $('<div> "文件路徑是:"' + response.fileUrl + '"隨機的文件名字爲:"' + file.name + '</div>') ); } }, UploadComplete : function( uploader,files ) { console.log("全部文件上傳完畢"); }, UploadProgress : function( uploader,file ) { $("#progress").html("上傳進度爲:" + file.percent + "%"); console.log( file.percent ); } } }); uploader.init(); </script> </html>
總體界面以下:github