//相关依赖
1 <!-- https://mvnrepository.com/artifact/commons-fileupload/commons-fileupload --> 2 <dependency> 3 <groupId>commons-fileupload</groupId> 4 <artifactId>commons-fileupload</artifactId> 5 <version>1.3.2</version> 6 </dependency> 7 8 <!-- https://mvnrepository.com/artifact/commons-io/commons-io --> 9 <dependency> 10 <groupId>commons-io</groupId> 11 <artifactId>commons-io</artifactId> 12 <version>2.5</version> 13 </dependency>
webuploader组件下载地址: http://fex.baidu.com/webuploader/
jquery组件下载地址:https://jquery.org/history/
目录结构:
servlet1 :
1 import java.io.File; 2 import java.io.FileFilter; 3 import java.io.FileInputStream; 4 import java.io.FileOutputStream; 5 import java.io.IOException; 6 import java.nio.channels.FileChannel; 7 import java.util.ArrayList; 8 import java.util.Arrays; 9 import java.util.Collections; 10 import java.util.Comparator; 11 import java.util.List; 12 import java.util.UUID; 13 14 import javax.servlet.ServletException; 15 import javax.servlet.annotation.WebServlet; 16 import javax.servlet.http.HttpServlet; 17 import javax.servlet.http.HttpServletRequest; 18 import javax.servlet.http.HttpServletResponse; 19 20 21 @WebServlet("/uploadActionServlet") 22 public class UploadActionServlet extends HttpServlet { 23 private static final long serialVersionUID = 1L; 24 private String serverPath = "H:/"; 25 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 26 String action = request.getParameter("action"); 27 if("mergeChunks".equals(action)){ 28 //合并文件 29 //获取需要合并文件的目录标记 30 String fileMd5 = request.getParameter("fileMd5"); 31 //读取目录里面的所有文件 32 File f = new File(serverPath + "/" +fileMd5); 33 File[] fileArray = f.listFiles(new FileFilter(){ 34 //排除目录 只要文件 35 public boolean accept(File pathname){ 36 if(pathname.isDirectory()){ 37 return false; 38 } 39 return true; 40 } 41 }); 42 //转成集合 便于排序 43 List<File> fileList = new ArrayList<File>(Arrays.asList(fileArray)); 44 //从小到大排序 45 Collections.sort(fileList,new Comparator<File>() { 46 47 public int compare(File o1,File o2){ 48 if(Integer.parseInt(o1.getName())<Integer.parseInt(o2.getName())){ 49 return -1; 50 } 51 return 1; 52 } 53 }); 54 55 File outputFile = new File(serverPath +"/"+UUID.randomUUID().toString()+".zip"); 56 57 //创建文件 58 outputFile.createNewFile(); 59 //输出流 60 FileChannel outChannel = new FileOutputStream(outputFile).getChannel(); 61 62 //合并 63 FileChannel inChannel; 64 for(File file : fileList){ 65 inChannel = new FileInputStream(file).getChannel(); 66 inChannel.transferTo(0, inChannel.size(), outChannel); 67 inChannel.close(); 68 //删除分片 69 file.delete(); 70 } 71 72 //清除文件夹 73 File tempFile = new File(serverPath+"/"+fileMd5); 74 if(tempFile.isDirectory() && tempFile.exists()){ 75 tempFile.delete(); 76 } 77 //关闭流 78 outChannel.close(); 79 response.setContentType("text/html;charset=utf-8"); 80 response.getWriter().write("{"msg":"合并成功"}"); 81 }else if("checkChunk".equals(action)){ 82 //检查当前分块是否上传成功 83 String fileMd5 = request.getParameter("fileMd5"); 84 String chunk = request.getParameter("chunk"); 85 String chunkSize = request.getParameter("chunkSize"); 86 //找到分块文件 87 File checkFile = new File(serverPath+"/"+fileMd5+"/"+chunk); 88 89 response.setContentType("text/html;charset=utf-8"); 90 //检查文件是否存在,且大小是否一致 91 if(checkFile.exists() && checkFile.length()==Integer.parseInt(chunkSize)){ 92 //表示上传过了 93 response.getWriter().write("{"ifExist":"1"}"); 94 }else{ 95 //表示未上传过 96 response.getWriter().write("{"ifExist":"0"}"); 97 } 98 } 99 } 100 101 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 102 doGet(request, response); 103 } 104 }
servlet2 :
1 import java.io.File; 2 import java.io.IOException; 3 import java.util.List; 4 5 import javax.servlet.ServletException; 6 import javax.servlet.http.HttpServlet; 7 import javax.servlet.http.HttpServletRequest; 8 import javax.servlet.http.HttpServletResponse; 9 10 import org.apache.commons.fileupload.FileItem; 11 import org.apache.commons.fileupload.FileUploadException; 12 import org.apache.commons.fileupload.disk.DiskFileItemFactory; 13 import org.apache.commons.fileupload.servlet.ServletFileUpload; 14 import org.apache.commons.io.FileUtils; 15 16 public class UploadServlet extends HttpServlet { 17 private static final long serialVersionUID = 1L; 18 19 private String serverPath = "H:/"; 20 21 @Override 22 protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 23 24 } 25 26 @Override 27 protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 28 //创建DiskFileItemFactory对象 配置缓存信息 29 DiskFileItemFactory factory = new DiskFileItemFactory(); 30 ServletFileUpload suf = new ServletFileUpload(factory); 31 suf.setHeaderEncoding("utf-8"); 32 String fileMd5 = null;//分块的唯一标记 33 String chunk = null;//分块的索引 34 try { 35 List<FileItem> items = suf.parseRequest(req); 36 for(FileItem item : items){ 37 if(item.isFormField()){ 38 //普通文件 39 String fieldName = item.getFieldName(); 40 if("fileMd5".equals(fieldName)){ 41 fileMd5 = item.getString("utf-8"); 42 System.out.println(fileMd5); 43 } 44 if("chunk".equals(fieldName)){ 45 chunk = item.getString("utf-8"); 46 System.out.println(chunk); 47 } 48 49 50 }else{ 51 //文件 52 53 /*//获取文件名称 54 String name = item.getName(); 55 //获取文件的实际内容 56 InputStream is = item.getInputStream(); 57 //保存文件 58 FileUtils.copyInputStreamToFile(is, new File(serverPath + "/" + name));*/ 59 60 //保存分块文件 61 //以分块的唯一标记创建一个文件夹 62 File file = new File(serverPath +"/" + fileMd5); 63 if(!file.exists()){ 64 file.mkdir(); 65 } 66 //根据分块索引在 67 File chunkFile = new File(serverPath +"/" +fileMd5+"/"+ chunk); 68 FileUtils.copyInputStreamToFile(item.getInputStream(),chunkFile); 69 } 70 } 71 } catch (FileUploadException e) { 72 e.printStackTrace(); 73 } 74 } 75 }
web.xml文件:
1 <?xml version="1.0" encoding="UTF-8"?> 2 <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1"> 3 <display-name>test</display-name> 4 <welcome-file-list> 5 <welcome-file>index.html</welcome-file> 6 <welcome-file>index.htm</welcome-file> 7 <welcome-file>index.jsp</welcome-file> 8 <welcome-file>default.html</welcome-file> 9 <welcome-file>default.htm</welcome-file> 10 <welcome-file>default.jsp</welcome-file> 11 </welcome-file-list> 12 <servlet> 13 <servlet-name>upload</servlet-name> 14 <servlet-class>com.yanfuchang.UploadServlet</servlet-class> 15 </servlet> 16 <servlet-mapping> 17 <servlet-name>upload</servlet-name> 18 <url-pattern>/uploadServlet.do</url-pattern> 19 </servlet-mapping> 20 </web-app>
upload1.jsp
1 <%@ page language="java" contentType="text/html; charset=UTF-8" 2 pageEncoding="UTF-8"%> 3 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 4 <html> 5 <head> 6 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 7 <title>fileupload简单文件上传</title> 8 </head> 9 <body> 10 <form method="post" enctype="multipart/form-data" action="${pageContext.request.contextPath}/uploadServlet.do"> 11 选择文件: 12 <input type="file" name="name"/><br> 13 <input type="submit" value="提交"/> 14 </form> 15 </body> 16 </html>
upload3.jsp
1 <%@ page language="java" contentType="text/html; charset=UTF-8" 2 pageEncoding="UTF-8"%> 3 <%request.setAttribute("webPath", request.getContextPath()); %> 4 <!DOCTYPE html> 5 <html> 6 <head> 7 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 8 <title>使用webupload简单的文件上传到服务器</title> 9 <link rel="stylesheet" type="text/css" href="${webPath}/js/webuploader.css"> 10 <script type="text/javascript" src="${webPath}/js/jquery-1.11.1.js"></script> 11 <script type="text/javascript" src="${webPath}/js/webuploader.js"></script> 12 </head> 13 <body> 14 15 <!--dom结构部分--> 16 <div id="uploader"> 17 <div id="fileList"></div> 18 <div id="filePicker">选择文件</div> 19 </div> 20 21 <script type="text/javascript"> 22 // 初始化Web Uploader 23 var uploader = WebUploader.create({ 24 // swf文件路径 25 swf:'${webPath}/js/Uploader.swf', 26 // 文件接收服务端。 27 server:'${webPath}/uploadServlet.do', 28 // 选择文件的按钮。可选。 29 // 内部根据当前运行是创建,可能是input元素,也可能是flash. 30 pick:'#filePicker', 31 // 选完文件后,是否自动上传。 32 auto:true, 33 }); 34 </script> 35 36 </body> 37 </html>
upload4.jsp
1 <%@ page language="java" contentType="text/html; charset=UTF-8" 2 pageEncoding="UTF-8"%> 3 <%request.setAttribute("webPath", request.getContextPath()); %> 4 <!DOCTYPE html> 5 <html> 6 <head> 7 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 8 <title>上传文件 显示文件名 显示上传进度</title> 9 <link rel="stylesheet" type="text/css" href="${webPath}/js/webuploader.css"> 10 <script type="text/javascript" src="${webPath}/js/jquery-1.11.1.js"></script> 11 <script type="text/javascript" src="${webPath}/js/webuploader.js"></script> 12 </head> 13 <body> 14 15 <!--dom结构部分--> 16 <div id="uploader"> 17 <div id="fileList"></div> 18 <div id="filePicker">选择文件</div> 19 </div> 20 21 <script type="text/javascript"> 22 // 初始化Web Uploader 23 var uploader = WebUploader.create({ 24 // swf文件路径 25 swf:'${webPath}/js/Uploader.swf', 26 // 文件接收服务端。 27 server:'${webPath}/uploadServlet.do', 28 // 选择文件的按钮。可选。 29 // 内部根据当前运行是创建,可能是input元素,也可能是flash. 30 pick:'#filePicker', 31 // 选完文件后,是否自动上传。 32 auto:true, 33 }); 34 35 //当有文件被添加进队列的时候 执行指定函数 36 uploader.on('fileQueued',function(file) { 37 //将选中文件的文件信息 追加到id为fileList的div中 38 $("#fileList").append("<div id="+file.id+"><span>"+file.name+"</span><div><span class='percentage'></span></div></div>"); 39 }); 40 41 //当文件上传过程中实现监控 42 //percentage表示上传文件的百分比 0.15 0.20 。。。。 43 uploader.on("uploadProgress",function(file, percentage){ 44 //将上传百分比添加到id为file.id中class为percentage的span标签中 45 $("#"+file.id).find("span.percentage").text(Math.round(percentage*100)+"%"); 46 }); 47 </script> 48 49 </body> 50 </html>
upload5.jsp
1 <%@ page language="java" contentType="text/html; charset=UTF-8" 2 pageEncoding="UTF-8"%> 3 <% 4 request.setAttribute("webPath", request.getContextPath()); 5 %> 6 <!DOCTYPE html> 7 <html> 8 <head> 9 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 10 <title>制作缩略图</title> 11 <link rel="stylesheet" type="text/css" 12 href="${webPath}/js/webuploader.css"> 13 <script type="text/javascript" src="${webPath}/js/jquery-1.11.1.js"></script> 14 <script type="text/javascript" src="${webPath}/js/webuploader.js"></script> 15 </head> 16 <body> 17 18 <!--dom结构部分--> 19 <div id="uploader"> 20 <div id="fileList"></div> 21 <div id="filePicker">选择文件</div> 22 </div> 23 24 <script type="text/javascript"> 25 // 初始化Web Uploader 26 var uploader = WebUploader.create({ 27 // swf文件路径 28 swf:'${webPath}/js/Uploader.swf', 29 // 文件接收服务端。 30 server:'${webPath}/uploadServlet.do', 31 // 选择文件的按钮。可选。 32 // 内部根据当前运行是创建,可能是input元素,也可能是flash. 33 pick:'#filePicker', 34 // 选完文件后,是否自动上传。 35 auto:true, 36 }); 37 38 //当有文件被添加进队列的时候 执行指定函数 39 uploader.on('fileQueued',function(file) { 40 //将选中文件的文件信息 追加到id为fileList的div中 41 $("#fileList").append("<div id="+file.id+"><img/><span>"+file.name+"</span><div><span class='percentage'></span></div></div>"); 42 43 //制作缩略图 44 //error 不是图标则error 45 //src 代表生成后的缩略图地址 46 uploader.makeThumb(file,function(error,src){ 47 //当上传的不是图片时 将定位元素替换成指定内容<span>不能预览</span> 48 if (error) { 49 $("#"+file.id).find("img").replaceWith('<span>不能预览</span>'); 50 return; 51 } 52 $("#"+file.id).find("img").attr('src',src); 53 }); 54 }); 55 56 //当文件上传过程中实现监控 57 //percentage表示上传文件的百分比 0.15 0.20 。。。。 58 uploader.on("uploadProgress",function(file, percentage){ 59 //将上传百分比添加到id为file.id中class为percentage的span标签中 60 $("#"+file.id).find("span.percentage").text(Math.round(percentage*100)+"%"); 61 }); 62 </script> 63 64 </body> 65 </html>
upload6.jsp
1 <%@ page language="java" contentType="text/html; charset=UTF-8" 2 pageEncoding="UTF-8"%> 3 <% 4 request.setAttribute("webPath", request.getContextPath()); 5 %> 6 <!DOCTYPE html> 7 <html> 8 <head> 9 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 10 <title>实现粘贴上传 和 拖拽上传</title> 11 <link rel="stylesheet" type="text/css" 12 href="${webPath}/js/webuploader.css"> 13 <script type="text/javascript" src="${webPath}/js/jquery-1.11.1.js"></script> 14 <script type="text/javascript" src="${webPath}/js/webuploader.js"></script> 15 <style type="text/css"> 16 #dndArea{ 17 200px; 18 height:100px; 19 border-color:red; 20 border-style:dashed; 21 } 22 </style> 23 </head> 24 <body> 25 26 <!--dom结构部分--> 27 <div id="uploader"> 28 <!-- 拖拽和黏贴图片的位置 --> 29 <div id="dndArea"></div> 30 31 <!-- 用于显示上传文件 --> 32 <div id="fileList"></div> 33 <!-- 用于选择上传文件 --> 34 <div id="filePicker">选择文件</div> 35 </div> 36 37 <script type="text/javascript"> 38 // 初始化Web Uploader 39 var uploader = WebUploader.create({ 40 // swf文件路径 41 swf:'${webPath}/js/Uploader.swf', 42 // 文件接收服务端。 43 server:'${webPath}/uploadServlet.do', 44 // 选择文件的按钮。可选。 45 // 内部根据当前运行是创建,可能是input元素,也可能是flash. 46 pick:'#filePicker', 47 // 选完文件后,是否自动上传。 48 auto:true, 49 50 51 //----------------------拖拽上传和黏贴上传------------------------------- 52 //开启拖拽区域 53 dnd:"#dndArea", 54 //禁用页面其他地方的拖拽功能,防止页面直接打开文件 55 disableGlobalDnd:true, 56 //开启黏贴功能 57 paste:"#uploader" 58 //------------------------------------------------------------- 59 60 }); 61 62 63 //当有文件被添加进队列的时候 执行指定函数 64 uploader.on('fileQueued',function(file) { 65 //将选中文件的文件信息 追加到id为fileList的div中 66 $("#fileList").append("<div id="+file.id+"><img/><span>"+file.name+"</span><div><span class='percentage'></span></div></div>"); 67 68 69 70 //-----------制作缩略图 当上传的是图片时显示缩略图 不是则显示提示字样-------------- 71 //error 不是图标则error 72 //src 代表生成后的缩略图地址 73 uploader.makeThumb(file,function(error,src){ 74 //当上传的不是图片时 将定位元素替换成指定内容<span>不能预览</span> 75 if (error) { 76 $("#"+file.id).find("img").replaceWith('<span>不能预览</span>'); 77 return; 78 } 79 $("#"+file.id).find("img").attr('src',src); 80 }); 81 //------------------------------------------------------------------ 82 83 }); 84 85 //-----------------------------监控上传过程 显示上传百分比------------------------------------------ 86 //当文件上传过程中实现监控 87 //percentage表示上传文件的百分比 0.15 0.20 。。。。 88 uploader.on("uploadProgress",function(file, percentage){ 89 //将上传百分比添加到id为file.id中class为percentage的span标签中 90 $("#"+file.id).find("span.percentage").text(Math.round(percentage*100)+"%"); 91 }); 92 //----------------------------------------------------------------------- 93 </script> 94 95 </body> 96 </html>
upload7.jsp
1 <%@ page language="java" contentType="text/html; charset=UTF-8" 2 pageEncoding="UTF-8"%> 3 <% 4 request.setAttribute("webPath", request.getContextPath()); 5 %> 6 <!DOCTYPE html> 7 <html> 8 <head> 9 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 10 <title>限制值允许图片文件上传</title> 11 <link rel="stylesheet" type="text/css" 12 href="${webPath}/js/webuploader.css"> 13 <script type="text/javascript" src="${webPath}/js/jquery-1.11.1.js"></script> 14 <script type="text/javascript" src="${webPath}/js/webuploader.js"></script> 15 <style type="text/css"> 16 #dndArea{ 17 200px; 18 height:100px; 19 border-color:red; 20 border-style:dashed; 21 } 22 </style> 23 </head> 24 <body> 25 26 <!--dom结构部分--> 27 <div id="uploader"> 28 <!-- 拖拽和黏贴图片的位置 --> 29 <div id="dndArea"></div> 30 31 <!-- 用于显示上传文件 --> 32 <div id="fileList"></div> 33 <!-- 用于选择上传文件 --> 34 <div id="filePicker">选择文件</div> 35 </div> 36 37 <script type="text/javascript"> 38 // 初始化Web Uploader 39 var uploader = WebUploader.create({ 40 // swf文件路径 41 swf:'${webPath}/js/Uploader.swf', 42 // 文件接收服务端。 43 server:'${webPath}/uploadServlet.do', 44 // 选择文件的按钮。可选。 45 // 内部根据当前运行是创建,可能是input元素,也可能是flash. 46 pick:'#filePicker', 47 // 选完文件后,是否自动上传。 48 auto:true, 49 50 51 //----------------------拖拽上传和黏贴上传------------------------------- 52 //开启拖拽区域 53 dnd:"#dndArea", 54 //禁用页面其他地方的拖拽功能,防止页面直接打开文件 55 disableGlobalDnd:true, 56 //开启黏贴功能 57 paste:"#uploader", 58 //------------------------------------------------------------- 59 60 61 // --------------限制 只允许图片文件上传------------------------ 62 accept: { 63 title: 'Images', 64 extensions: 'gif,jpg,jpeg,bmp,png', 65 mimeTypes: 'image/*' 66 } 67 //------------------------------------------ 68 }); 69 70 71 //当有文件被添加进队列的时候 执行指定函数 72 uploader.on('fileQueued',function(file) { 73 //将选中文件的文件信息 追加到id为fileList的div中 74 $("#fileList").append("<div id="+file.id+"><img/><span>"+file.name+"</span><div><span class='percentage'></span></div></div>"); 75 76 77 78 //-----------制作缩略图 当上传的是图片时显示缩略图 不是则显示提示字样-------------- 79 //error 不是图标则error 80 //src 代表生成后的缩略图地址 81 uploader.makeThumb(file,function(error,src){ 82 //当上传的不是图片时 将定位元素替换成指定内容<span>不能预览</span> 83 if (error) { 84 $("#"+file.id).find("img").replaceWith('<span>不能预览</span>'); 85 return; 86 } 87 $("#"+file.id).find("img").attr('src',src); 88 }); 89 //------------------------------------------------------------------ 90 91 }); 92 93 //-----------------------------监控上传过程 显示上传百分比------------------------------------------ 94 //当文件上传过程中实现监控 95 //percentage表示上传文件的百分比 0.15 0.20 。。。。 96 uploader.on("uploadProgress",function(file, percentage){ 97 //将上传百分比添加到id为file.id中class为percentage的span标签中 98 $("#"+file.id).find("span.percentage").text(Math.round(percentage*100)+"%"); 99 }); 100 //----------------------------------------------------------------------- 101 </script> 102 103 </body> 104 </html>
upload8.jsp
1 <%@ page language="java" contentType="text/html; charset=UTF-8" 2 pageEncoding="UTF-8"%> 3 <% 4 request.setAttribute("webPath", request.getContextPath()); 5 %> 6 <!DOCTYPE html> 7 <html> 8 <head> 9 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 10 <title>实现分块上传</title> 11 <link rel="stylesheet" type="text/css" 12 href="${webPath}/js/webuploader.css"> 13 <script type="text/javascript" src="${webPath}/js/jquery-1.11.1.js"></script> 14 <script type="text/javascript" src="${webPath}/js/webuploader.js"></script> 15 <style type="text/css"> 16 #dndArea{ 17 200px; 18 height:100px; 19 border-color:red; 20 border-style:dashed; 21 } 22 </style> 23 </head> 24 <body> 25 26 <!--dom结构部分--> 27 <div id="uploader"> 28 <!-- 拖拽和黏贴图片的位置 --> 29 <div id="dndArea"></div> 30 31 <!-- 用于显示上传文件 --> 32 <div id="fileList"></div> 33 <!-- 用于选择上传文件 --> 34 <div id="filePicker">选择文件</div> 35 </div> 36 37 <script type="text/javascript"> 38 var fileMd5; 39 //监听分块上传过程中的三个时间点 40 WebUploader.Uploader.register({ 41 "before-send-file":"beforeSendFile", 42 "before-send":"beforeSend", 43 "after-send-file":"afterSendFile" 44 },{ 45 //时间点1:所有分块进行上传之前调用此函数 46 beforeSendFile:function(file){ 47 //创建通知对象 48 var deferred = WebUploader.Deferred(); 49 50 //计算文件的唯一标记,用于断点续传和秒传 51 (new WebUploader.Uploader()).md5File(file,0,5*1024*1024) 52 .progress(function(percentage){ 53 $("#"+file.id).find("div.state").text("正在获取文件信息...."); 54 }).then(function(val){ 55 fileMd5 = val; 56 $("#"+file.id).find("div.state").text("成功获取文件信息"); 57 //文件获取成功才执行下一步操作 58 deferred.resolve(); 59 }); 60 //请求后台是否保存过该文件,如果存在则跳过该文件,实现秒传功能 61 return deferred.promise();//成功后通知 62 }, 63 //时间点2:如果有分块上传则每个分块上传之前调用此函数 64 beforeSend:function(){ 65 //创建通知对象 66 var deferred = WebUploader.Deferred(); 67 68 this.owner.options.formData.fileMd5 = fileMd5; 69 70 deferred.resolve();//成功后执行下一步 71 72 return deferred.promise();//成功后通知 73 //请求后台是否保存过当前分块,如果存在则跳过该文件,实现秒传功能 74 }, 75 //时间点3:所有分块上传成功之后调用此函数 76 afterSendFile:function(){ 77 //如果分块上传,则通过后台合并所有文件 78 $.ajax({ 79 data:{fileMd5:fileMd5}, 80 type:"post", 81 url:"${webPath}/uploadActionServlet?action=mergeChunks", 82 dataType:"json", 83 success:function(resp){ 84 alert(resp.msg) 85 } 86 }); 87 } 88 }); 89 90 91 92 93 // 初始化Web Uploader 94 var uploader = WebUploader.create({ 95 // swf文件路径 96 swf:'${webPath}/js/Uploader.swf', 97 // 文件接收服务端。 98 server:'${webPath}/uploadServlet.do', 99 // 选择文件的按钮。可选。 100 // 内部根据当前运行是创建,可能是input元素,也可能是flash. 101 pick:'#filePicker', 102 // 选完文件后,是否自动上传。 103 auto:true, 104 105 106 //----------------------拖拽上传和黏贴上传------------------------------- 107 //开启拖拽区域 108 dnd:"#dndArea", 109 //禁用页面其他地方的拖拽功能,防止页面直接打开文件 110 disableGlobalDnd:true, 111 //开启黏贴功能 112 paste:"#uploader", 113 //------------------------------------------------------------- 114 115 116 // --------------限制 只允许图片文件上传------------------------ 117 /* accept: { 118 title: 'Images', 119 extensions: 'gif,jpg,jpeg,bmp,png', 120 mimeTypes: 'image/*' 121 }, */ 122 //------------------------------------------ 123 124 //------------分块上传-------------------- 125 126 //开启分块上传 127 chunked:true, 128 //每块文件大小(默认5M) 129 chunkSize:5*1024*1024 130 }); 131 132 133 //当有文件被添加进队列的时候 执行指定函数 134 uploader.on('fileQueued',function(file) { 135 //将选中文件的文件信息 追加到id为fileList的div中 136 $("#fileList").append("<div id="+file.id+"><img/><span>"+file.name+"</span><div><span class='percentage'></span></div><div class='state'></div></div>"); 137 138 139 140 //-----------制作缩略图 当上传的是图片时显示缩略图 不是则显示提示字样-------------- 141 //error 不是图标则error 142 //src 代表生成后的缩略图地址 143 uploader.makeThumb(file,function(error,src){ 144 //当上传的不是图片时 将定位元素替换成指定内容<span>不能预览</span> 145 if (error) { 146 $("#"+file.id).find("img").replaceWith('<span>不能预览</span>'); 147 return; 148 } 149 $("#"+file.id).find("img").attr('src',src); 150 }); 151 //------------------------------------------------------------------ 152 153 }); 154 155 //-----------------------------监控上传过程 显示上传百分比------------------------------------------ 156 //当文件上传过程中实现监控 157 //percentage表示上传文件的百分比 0.15 0.20 。。。。 158 uploader.on("uploadProgress",function(file, percentage){ 159 //将上传百分比添加到id为file.id中class为percentage的span标签中 160 $("#"+file.id).find("span.percentage").text(Math.round(percentage*100)+"%"); 161 }); 162 //----------------------------------------------------------------------- 163 </script> 164 165 </body> 166 </html>
upload9.jsp
1 <%@ page language="java" contentType="text/html; charset=UTF-8" 2 pageEncoding="UTF-8"%> 3 <% 4 request.setAttribute("webPath", request.getContextPath()); 5 %> 6 <!DOCTYPE html> 7 <html> 8 <head> 9 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 10 <title>实现断点上传</title> 11 <link rel="stylesheet" type="text/css" 12 href="${webPath}/js/webuploader.css"> 13 <script type="text/javascript" src="${webPath}/js/jquery-1.11.1.js"></script> 14 <script type="text/javascript" src="${webPath}/js/webuploader.js"></script> 15 <style type="text/css"> 16 #dndArea{ 17 200px; 18 height:100px; 19 border-color:red; 20 border-style:dashed; 21 } 22 </style> 23 </head> 24 <body> 25 26 <!--dom结构部分--> 27 <div id="uploader"> 28 <!-- 拖拽和黏贴图片的位置 --> 29 <div id="dndArea"></div> 30 31 <!-- 用于显示上传文件 --> 32 <div id="fileList"></div> 33 <!-- 用于选择上传文件 --> 34 <div id="filePicker">选择文件</div> 35 </div> 36 37 <script type="text/javascript"> 38 var fileMd5; 39 //监听分块上传过程中的三个时间点 40 WebUploader.Uploader.register({ 41 "before-send-file":"beforeSendFile", 42 "before-send":"beforeSend", 43 "after-send-file":"afterSendFile" 44 },{ 45 //时间点1:所有分块进行上传之前调用此函数 46 beforeSendFile:function(file){ 47 //创建通知对象 48 var deferred = WebUploader.Deferred(); 49 50 //计算文件的唯一标记,用于断点续传和秒传 51 (new WebUploader.Uploader()).md5File(file,0,5*1024*1024) 52 .progress(function(percentage){ 53 $("#"+file.id).find("div.state").text("正在获取文件信息...."); 54 }).then(function(val){ 55 fileMd5 = val; 56 $("#"+file.id).find("div.state").text("成功获取文件信息"); 57 //文件获取成功才执行下一步操作 58 deferred.resolve(); 59 }); 60 //请求后台是否保存过该文件,如果存在则跳过该文件,实现秒传功能 61 return deferred.promise();//成功后通知 62 }, 63 //时间点2:如果有分块上传则每个分块上传之前调用此函数 64 beforeSend:function(block){ 65 //创建通知对象 66 var deferred = WebUploader.Deferred(); 67 68 this.owner.options.formData.fileMd5 = fileMd5; 69 70 $.ajax({ 71 type:"post", 72 url:"${webPath}/uploadActionServlet?action=checkChunk", 73 data:{ 74 //文件唯一标记 75 fileMd5:fileMd5, 76 chunk:block.chunk, 77 chunkSize:block.end-block.start 78 }, 79 dataType:"json", 80 success:function(resp){ 81 if(resp.ifExist){ 82 //分块存在,跳过该分块 83 deferred.reject(); 84 }else{ 85 //分块不存在或者不完整 ,重新发送该分块内容 86 deferred.resolve(); 87 } 88 } 89 }); 90 91 deferred.resolve();//成功后执行下一步 92 93 return deferred.promise();//成功后通知 94 //请求后台是否保存过当前分块,如果存在则跳过该文件,实现秒传功能 95 }, 96 //时间点3:所有分块上传成功之后调用此函数 97 afterSendFile:function(){ 98 //如果分块上传,则通过后台合并所有文件 99 $.ajax({ 100 data:{fileMd5:fileMd5}, 101 type:"post", 102 url:"${webPath}/uploadActionServlet?action=mergeChunks", 103 dataType:"json", 104 success:function(resp){ 105 alert(resp.msg) 106 } 107 }); 108 } 109 }); 110 111 112 113 114 // 初始化Web Uploader 115 var uploader = WebUploader.create({ 116 // swf文件路径 117 swf:'${webPath}/js/Uploader.swf', 118 // 文件接收服务端。 119 server:'${webPath}/uploadServlet.do', 120 // 选择文件的按钮。可选。 121 // 内部根据当前运行是创建,可能是input元素,也可能是flash. 122 pick:'#filePicker', 123 // 选完文件后,是否自动上传。 124 auto:true, 125 126 127 //----------------------拖拽上传和黏贴上传------------------------------- 128 //开启拖拽区域 129 dnd:"#dndArea", 130 //禁用页面其他地方的拖拽功能,防止页面直接打开文件 131 disableGlobalDnd:true, 132 //开启黏贴功能 133 paste:"#uploader", 134 //------------------------------------------------------------- 135 136 137 // --------------限制 只允许图片文件上传------------------------ 138 /* accept: { 139 title: 'Images', 140 extensions: 'gif,jpg,jpeg,bmp,png', 141 mimeTypes: 'image/*' 142 }, */ 143 //------------------------------------------ 144 145 //------------分块上传-------------------- 146 147 //开启分块上传 148 chunked:true, 149 //每块文件大小(默认5M) 150 chunkSize:5*1024*1024 151 }); 152 153 154 //当有文件被添加进队列的时候 执行指定函数 155 uploader.on('fileQueued',function(file) { 156 //将选中文件的文件信息 追加到id为fileList的div中 157 $("#fileList").append("<div id="+file.id+"><img/><span>"+file.name+"</span><div><span class='percentage'></span></div><div class='state'></div></div>"); 158 159 160 161 //-----------制作缩略图 当上传的是图片时显示缩略图 不是则显示提示字样-------------- 162 //error 不是图标则error 163 //src 代表生成后的缩略图地址 164 uploader.makeThumb(file,function(error,src){ 165 //当上传的不是图片时 将定位元素替换成指定内容<span>不能预览</span> 166 if (error) { 167 $("#"+file.id).find("img").replaceWith('<span>不能预览</span>'); 168 return; 169 } 170 $("#"+file.id).find("img").attr('src',src); 171 }); 172 //------------------------------------------------------------------ 173 174 }); 175 176 //-----------------------------监控上传过程 显示上传百分比------------------------------------------ 177 //当文件上传过程中实现监控 178 //percentage表示上传文件的百分比 0.15 0.20 。。。。 179 uploader.on("uploadProgress",function(file, percentage){ 180 //将上传百分比添加到id为file.id中class为percentage的span标签中 181 $("#"+file.id).find("span.percentage").text(Math.round(percentage*100)+"%"); 182 }); 183 //----------------------------------------------------------------------- 184 </script> 185 186 </body> 187 </html>