最后发现plupload可以上传超4G,并且Silverlight,flash,html4,html5模式上传
Silverlight 安装微软的Silverlight
flash只要浏览器支持flash就行,但存在一个bug,文件超过4G时,选择文件后上传列表不响应,只能推拽进上传列表
html5浏览器支持
以上只需要存在一个即可上传
不废话,直接看代码,希望大家指教
找到plupload.dev.js
修改成如下:
onUploadFile function onUploadFile(up, file) { var url = up.settings.url, chunkSize = up.settings.chunk_size, retries = up.settings.max_retries, features = up.features, offset = 0, blob; if (file.name != null) { $.get("ckeck", { filename : file.name, chunk_size:up.settings.chunk_size, }, function(data) { offset = data.off; }); }
断点续传需要数据库的支持,因为是测试使用简单的JDBC操作数据库
package db; import java.sql.*; public class Database { private String dbDriver="com.mysql.jdbc.Driver"; private String sConnStr = "jdbc:mysql://localhost:3306/upload?useUnicode=true&characterEncoding=UTF-8"; public Connection connect = null; public ResultSet rs=null; public Database() { try { Class.forName(dbDriver).newInstance(); connect = DriverManager.getConnection(sConnStr,"root",""); } catch (Exception ex) { System.out.println(""); } } public ResultSet executeQuery(String sql) { System.out.println(sql); try{ connect=DriverManager.getConnection(sConnStr,"root",""); Statement stmt=connect.createStatement(); rs=stmt.executeQuery(sql); }catch(SQLException ex){ System.err.println(ex.getMessage()); } return rs; } public void executeUpdate(String sql) { System.out.println(sql); Statement stmt=null; rs=null; try { connect=DriverManager.getConnection(sConnStr,"root",""); stmt=connect.createStatement(); stmt.executeUpdate(sql); stmt.close(); connect.close(); } catch(SQLException ex) { System.err.println(ex.getMessage()); } } }
plupload是分块上传文件,记录文件上传到哪块,以便断点
package gson.demo; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.sql.ResultSet; import java.util.List; import java.util.UUID; import javax.servlet.ServletConfig; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; 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 db.Database; public class UploaderServlet extends HttpServlet { private static final long serialVersionUID = 1L; String repositoryPath; String uploadPath; @SuppressWarnings("unchecked") public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setCharacterEncoding("UTF-8"); Integer schunk = null;// 分割块数 Integer schunks = null;// 总分割数 String name = null;// 文件名 BufferedOutputStream outputStream = null; 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 * 1024);// 设置附近大小 List<FileItem> items = upload.parseRequest(request); // 生成新文件名 String newFileName = null; for (FileItem item : items) { if (!item.isFormField()) {// 如果是文件类型 name = newFileName;// 获得文件名 if (name != null) { String nFname = newFileName; if (schunk != null) { nFname = schunk + "_" + name; } File savedFile = new File(uploadPath, nFname); item.write(savedFile); } } else { // 判断是否带分割信息 if (item.getFieldName().equals("chunk")) { schunk = Integer.parseInt(item.getString()); System.out.println(schunk); } if (item.getFieldName().equals("chunks")) { schunks = Integer.parseInt(item.getString()); } if (item.getFieldName().equals("name")) { newFileName = item.getString(); } } } Database db = new Database(); if (schunk != null && schunk == 0) { String ckcksql = "select * from file where filename ='" + newFileName + "'"; db.executeQuery(ckcksql); if (db.rs.first()) { } else { String sql = "INSERT INTO file (filename,schunk,schunks) VALUES ('" + newFileName + "'," + schunk + "," + schunks + ")"; db.executeUpdate(sql); } } else { String sql = "update file set schunk=" + schunk + " where filename ='" + newFileName + "'"; db.executeUpdate(sql); } if (schunk != null && schunk + 1 == schunks) { outputStream = new BufferedOutputStream( new FileOutputStream(new File(uploadPath, newFileName))); // 遍历文件合并 for (int i = 0; i < schunks; i++) { File tempFile = new File(uploadPath, i + "_" + name); byte[] bytes = FileUtils.readFileToByteArray(tempFile); outputStream.write(bytes); outputStream.flush(); tempFile.delete(); } outputStream.flush(); } response.getWriter() .write("{\"status\":true,\"newName\":\"" + newFileName + "\"}"); } catch (FileUploadException e) { e.printStackTrace(); response.getWriter().write("{\"status\":false}"); } catch (Exception e) { e.printStackTrace(); response.getWriter().write("{\"status\":false}"); } finally { try { if (outputStream != null) outputStream.close(); } catch (IOException e) { e.printStackTrace(); } } } } @Override public void init(ServletConfig config) throws ServletException { repositoryPath = FileUtils.getTempDirectoryPath(); System.out.println("临时目录:" + repositoryPath); uploadPath = config.getServletContext().getRealPath( config.getInitParameter("uploadPath")); System.out.println("目录:" + uploadPath); File up = new File(uploadPath); if (!up.exists()) { up.mkdir(); } } }
上传之前检测文件是否上传过,注:修改文件后再上传未作处理,可获取文件大小存库,对比,如果大小改变,不再断点续传,重新上传
数据库设计(Mysql)
package gson.demo; import java.io.File; import java.io.IOException; import java.sql.ResultSet; import java.sql.SQLException; import javax.servlet.ServletConfig; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.commons.io.FileUtils; import db.Database; public class CkeckFileServlet extends HttpServlet { String repositoryPath; String uploadPath; @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // TODO Auto-generated method stub String fileName=new String(req.getParameter("filename").getBytes("8859_1"),"utf-8"); String chunk_size = req.getParameter("chunk_size"); System.out.println(chunk_size); System.out.println(fileName); resp.setContentType("text/json; charset=utf-8"); Database db = new Database(); String sql = "select * from file where filename = '" + fileName+"'"; ResultSet RS_result = db.executeQuery(sql); try { if (db.rs.first()) { int schunk = RS_result.getInt("schunk"); //删除最近一个分块,防止最后一个分块未上传之前被断开上传,一般不会发生 deleteFile(uploadPath+schunk+"_"+fileName); long off = schunk * Long.parseLong(chunk_size); resp.getWriter().write("{\"off\":"+off+"}"); } else { resp.getWriter().write("{\"off\":0}"); } } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // TODO Auto-generated method stub doGet(req, resp); } @Override public void init(ServletConfig config) throws ServletException { repositoryPath = FileUtils.getTempDirectoryPath(); uploadPath = config.getServletContext().getRealPath( config.getInitParameter("uploadPath")); File up = new File(uploadPath); if (!up.exists()) { up.mkdir(); } } public boolean deleteFile(String sPath) { boolean flag = false; File file = new File(sPath); // 路径为文件且不为空则进行删除 if (file.isFile() && file.exists()) { file.delete(); flag = true; } return flag; } }
首页
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <% String path = request.getContextPath(); String basePath = request.getScheme() + "://"+ request.getServerName() + ":" + request.getServerPort()+ path + "/"; %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <base href="<%=basePath%>"> <title>GodSon Easyui 结合Pluplaod插件的上传演示</title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="This is my page"> <link rel="stylesheet" href="bootstrap/easyui.css" type="text/css"></link> <script type="text/javascript" src="jquery-1.8.0.min.js"></script> <script type="text/javascript" src="easyui/jquery.easyui.min.js"></script> <script type="text/javascript"> /** * 创建上传窗口 公共方法 * @param chunk 是否分割大文件 * @param callBack 上传成功之后的回调 */ function Uploader(chunk,callBack){ var addWin = $('<div style="overflow: hidden;"/>'); var upladoer = $('<iframe/>'); upladoer.attr({'src':'<%=basePath%>/uploader.jsp?chunk='+chunk,width:'100%',height:'100%',frameborder:'0',scrolling:'no'}); addWin.window({ title:"上传文件", height:350, width:550, minimizable:false, modal:true, collapsible:false, maximizable:false, resizable:false, content:upladoer, onClose:function(){ var fw = GetFrameWindow(upladoer[0]); var files = fw.files; $(this).window('destroy'); callBack.call(this,files); }, onOpen:function(){ var target = $(this); setTimeout(function(){ var fw = GetFrameWindow(upladoer[0]); fw.target = target; },100); } }); } /** * 根据iframe对象获取iframe的window对象 * @param frame * @returns {Boolean} */ function GetFrameWindow(frame){ return frame && typeof(frame)=='object' && frame.tagName == 'IFRAME' && frame.contentWindow; } function makerUpload(chunk){ Uploader(chunk,function(files){ if(files && files.length>0){ $("#res").text("成功上传:"+files.join(",")); } }); } </script> </head> <body style="width: 100%;height: 100%;overflow:hidden;margin: 0;padding: 0;"> <h1>GodSon Easyui 结合Pluplaod插件的上传演示</h1> <hr/> <a class="easyui-linkbutton" href="javascript:makerUpload(false)">不分割文件上传</a> <a class="easyui-linkbutton" href="javascript:makerUpload(true)">分割文件上传</a> <hr/> <div id="res"></div> </body> </html>
上传页面
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>文件上传</title> <link rel="stylesheet" href="plupload/js/jquery.plupload.queue/css/jquery.plupload.queue.css" type="text/css"></link> <script type="text/javascript" src="jquery-1.8.0.min.js"></script> <script type="text/javascript" src="plupload/js/plupload.full.min.js"></script> <script type="text/javascript" src="plupload/js/i18n/Moxie.js"></script> <script type="text/javascript" src="plupload/js/i18n/zh_CN.js"></script> <script type="text/javascript" src="plupload/js/jquery.plupload.queue/jquery.plupload.queue.js"></script> <body style="padding: 0;margin: 0;"> <div id="uploader"> </div> <script type="text/javascript"> var files = []; var errors = []; var type = 'file'; var chunk = eval('${param.chunk}'); var max_file_size = '9000mb'; var filters = {title : "文档", extensions : "zip,doc,docx,xls,xlsx,ppt,pptx"}; $("#uploader").pluploadQueue($.extend({ runtimes : 'flash,html4,html5', url : 'uploader', max_file_size : max_file_size, file_data_name:'file', filters : [filters], // Flash settings flash_swf_url : '/plupload/plupload/js/Moxie.swf', // Silverlight settings silverlight_xap_url : '/plupload/plupload/js/Moxie.xap', init:{ FileUploaded:function(uploader,file,response){ if(response.response){ var rs = $.parseJSON(response.response); if(rs.status){ files.push(file.name); }else{ errors.push(file.name); } } }, UploadComplete:function(uploader,fs){ var e= errors.length ? ",失败"+errors.length+"个("+errors.join("、")+")。" : "。"; alert("上传完成!共"+fs.length+"个。成功"+files.length+e); target.window("close"); } } },(chunk ? {chunk_size:'5mb'} : {}))); </script> </body> </html>
除了上面说到的,修改文件之后上传未处理,还有一个中文乱码未处理,
if (item.getFieldName().equals("name")) { newFileName = item.getString(); }
修改编码
newFileName = new String(item.getString().getBytes("8859_1"),"utf-8");
对于修改文件之后,继续上传,在实际应用中我使用的是MD5对比,效果还不错
相关推荐
结合plupload这样的前端文件上传库,可以实现大文件的断点续传功能,提升用户体验并确保文件传输的可靠性。下面我们将详细探讨如何使用Spring Boot和plupload实现这一功能。 首先,plupload是一款开源的多浏览器...
Plupload支持断点续传功能,即使上传过程中网络中断,再次上传时可以从上次断点处继续,无需重新上传整个文件,这对于大文件上传特别有用。 7. **安全性考虑**: 为了防止恶意用户利用Plupload上传非法文件,应...
在本文中,我们将深入探讨如何使用SpringBoot框架与Plupload工具进行集成,以实现文件的批量上传、断点续传和秒传功能。这个项目基于SpringBoot 2和Plupload 2.3.6,提供了直观的上传进度条,并且是在IntelliJ IDEA...
在.NET MVC框架中,我们可以利用Plupload来构建用户友好的文件上传功能,提供断点续传、批量上传、进度条显示等特性。本示例将详细介绍如何在.NET MVC项目中集成并使用Plupload。 1. **Plupload组件介绍** ...
plupload是一款开源的跨浏览器文件上传组件,支持多种浏览器环境,包括IE6+、Firefox、Chrome、Safari以及Opera。它提供了丰富的API接口,可以方便地集成到各种Web应用中,实现高效、稳定、功能强大的文件上传功能。...
`plupload` 是一个强大的跨浏览器文件上传组件,它支持多线程上传、断点续传、本地预览等功能,能够显著提升用户体验。本文将详细介绍 `plupload` 的使用及其相关知识点。 首先,我们需要了解 `plupload` 的基本...
`plupload`是一个强大的JavaScript文件上传组件,它支持多种文件格式,包括视频文件,如`m4v`, `mpg`, `mp4`, `avi`, `mov`, `mk`, `wmv`等。这些格式都是视频文件的常见类型,每种都有其独特的特性和应用场景。 `...
Plupload是有TinyMCE的开发者开发的,为您的内容管理系统或是类似上传程序提供一个高度可用的上传插件。Plupload 目前分为一个核心API 和一个jQuery上传队列部件,这样使你可以直接使用或是自己定制。
**plupload多文件上传组件详解** plupload是一款强大的、跨浏览器的多文件上传组件,它支持多种文件上传方式,包括HTML5、Flash、Silverlight和HTML4,确保在不同的浏览器和设备上都能实现稳定可靠的文件上传功能。...
Plupload 2.1.2 文件上传控件使用示例 开发测试环境: C#.VS2010 、 MVC4 操作系统:windows7 IIS 7.5 测试上传文件大小1M、50M、500M、1.5G、4.2G 都能正常上传 支持断点续传,设置分块越小,则断点越近 超...
Plupload是一款强大的多文件上传组件,它旨在提供一个跨浏览器、跨平台的解决方案,使得用户可以方便地实现批量文件上传功能。这个组件以其兼容性广、功能完善而备受开发者青睐,支持多种技术栈,包括Flash、HTML5...
Plupload的核心特性在于其对多文件上传的支持、分块上传的能力以及实时的上传进度反馈,这使得用户能够更高效、更稳定地上传大量或大体积的文件。 1. **多文件选择与上传**:Plupload允许用户一次性选择多个文件...
Plupload是一款强大的多文件上传插件,它支持多种浏览器和平台,包括IE6在内的老旧浏览器。这款插件采用JavaScript编写,同时结合HTML5、Flash、Silverlight和HTML4等多种技术,确保在各种环境下都能实现文件的上传...
Java与Plupload结合实现多附件上传是一个常见的Web开发任务,主要涉及到前端的文件选择、上传逻辑和后端的文件接收、存储处理。Plupload是一款强大的跨浏览器文件上传组件,支持多种上传方式,如Flash、HTML5、...
plupload的特点在于其支持大文件的分片上传。传统的文件上传方式可能因文件过大导致上传失败或者时间过长,而plupload将大文件切割成多个小块(通常称为“分片”),逐个上传并合并,这样不仅可以提高上传速度,还能...
Plupload是一款强大的、跨平台的文件上传工具,它支持多种浏览器和文件上传方式,包括拖拽上传、多选文件以及批量上传整个文件夹。在Java环境中,我们可以利用Plupload的特性来实现用户友好的文件上传功能,提升用户...
基于SpringBoot的文件上传系统,前后端分离,单文件上传,多文件上传,大文件上传,断点续传,文件秒传,图片上传 项目经过严格测试,确保可以运行! 采用前后端分离的方式进行开发,实现了几种常用的文件上传功能...
Plupload是一个开源的JavaScript文件上传组件,它支持多种浏览器,并且内置了断点续传功能。 **Plupload介绍** Plupload是一款强大的多浏览器兼容的文件上传插件,通过Flash、HTML5、Silverlight等多种技术实现文件...
综上所述,"Plupload多文件上传(调整后)"项目是为了解决Struts2环境中大文件上传的问题,它利用了Plupload的分块上传和断点续传功能,同时可能优化了Servlet和Struts2的文件上传处理逻辑,以适应大文件的上传需求。...