`
gbguanbo
  • 浏览: 13941 次
  • 性别: Icon_minigender_1
  • 来自: 青岛
文章分类
社区版块
存档分类
最新评论

修改plupload,上传文件,支持断点,可上传超过2G

    博客分类:
  • java
阅读更多
一直在寻找一个能够上传4G以上文件,并且支持断点续传的插件,而且可以在多浏览器使用

最后发现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对比,效果还不错

 

 

 

 

  • 大小: 261.4 KB
  • 大小: 105.1 KB
分享到:
评论
6 楼 t12345pk 2016-01-06  
代码下载以后, 在IE下无法断点续传, 但是在谷歌下却可以。 这是什么情况? 
5 楼 xiandaodikei 2015-04-13  
plupload.dev.js  是全部覆盖么,还是往里面加代码。我全部覆盖后不支持断点续传了,加了之后支持但是断开连接后台总是报错  怎么解决呢?
4 楼 xiandaodikei 2015-04-13  
您好,我现在在做文件断点续传,您的文章给了很多帮助 ,但是有个问题需要大神帮忙解决下,断点续传在继续上传的时候开打页面怎么能让它显示未完进度呢?994882850这是我的QQ号码 希望能指点怎么做
3 楼 wuhaojia369 2015-03-15  
大神,能告诉我浏览器端怎么计算文件的MD5吗?
2 楼 lgs123 2015-01-30  
1 楼 ziyouren521125 2014-06-27  
非常好的想法,thx

相关推荐

    spring boot + plupload实现大文件断点续传

    结合plupload这样的前端文件上传库,可以实现大文件的断点续传功能,提升用户体验并确保文件传输的可靠性。下面我们将详细探讨如何使用Spring Boot和plupload实现这一功能。 首先,plupload是一款开源的多浏览器...

    基于plupload上传至阿里云oss源码

    Plupload支持断点续传功能,即使上传过程中网络中断,再次上传时可以从上次断点处继续,无需重新上传整个文件,这对于大文件上传特别有用。 7. **安全性考虑**: 为了防止恶意用户利用Plupload上传非法文件,应...

    springboot整合plupload,实现文件批量上传、断点续传、秒传 源码

    在本文中,我们将深入探讨如何使用SpringBoot框架与Plupload工具进行集成,以实现文件的批量上传、断点续传和秒传功能。这个项目基于SpringBoot 2和Plupload 2.3.6,提供了直观的上传进度条,并且是在IntelliJ IDEA...

    Plupload 上传.net MVC 上传示例

    在.NET MVC框架中,我们可以利用Plupload来构建用户友好的文件上传功能,提供断点续传、批量上传、进度条显示等特性。本示例将详细介绍如何在.NET MVC项目中集成并使用Plupload。 1. **Plupload组件介绍** ...

    plupload文件上传模块

    plupload是一款开源的跨浏览器文件上传组件,支持多种浏览器环境,包括IE6+、Firefox、Chrome、Safari以及Opera。它提供了丰富的API接口,可以方便地集成到各种Web应用中,实现高效、稳定、功能强大的文件上传功能。...

    前端组件 plupload 文件上传demo

    `plupload` 是一个强大的跨浏览器文件上传组件,它支持多线程上传、断点续传、本地预览等功能,能够显著提升用户体验。本文将详细介绍 `plupload` 的使用及其相关知识点。 首先,我们需要了解 `plupload` 的基本...

    plupload上传视频文件

    `plupload`是一个强大的JavaScript文件上传组件,它支持多种文件格式,包括视频文件,如`m4v`, `mpg`, `mp4`, `avi`, `mov`, `mk`, `wmv`等。这些格式都是视频文件的常见类型,每种都有其独特的特性和应用场景。 `...

    java + plupload上传文件

    Plupload是有TinyMCE的开发者开发的,为您的内容管理系统或是类似上传程序提供一个高度可用的上传插件。Plupload 目前分为一个核心API 和一个jQuery上传队列部件,这样使你可以直接使用或是自己定制。

    plupload 多文件上传组件

    **plupload多文件上传组件详解** plupload是一款强大的、跨浏览器的多文件上传组件,它支持多种文件上传方式,包括HTML5、Flash、Silverlight和HTML4,确保在不同的浏览器和设备上都能实现稳定可靠的文件上传功能。...

    文件上传[支持断点续传]Plupload+C#.vs2010

    Plupload 2.1.2 文件上传控件使用示例 开发测试环境: C#.VS2010 、 MVC4 操作系统:windows7 IIS 7.5 测试上传文件大小1M、50M、500M、1.5G、4.2G 都能正常上传 支持断点续传,设置分块越小,则断点越近 超...

    plupload多文件上传组建

    Plupload是一款强大的多文件上传组件,它旨在提供一个跨浏览器、跨平台的解决方案,使得用户可以方便地实现批量文件上传功能。这个组件以其兼容性广、功能完善而备受开发者青睐,支持多种技术栈,包括Flash、HTML5...

    plupload文件上传工具

    Plupload的核心特性在于其对多文件上传的支持、分块上传的能力以及实时的上传进度反馈,这使得用户能够更高效、更稳定地上传大量或大体积的文件。 1. **多文件选择与上传**:Plupload允许用户一次性选择多个文件...

    Plupload多文件上传

    Plupload是一款强大的多文件上传插件,它支持多种浏览器和平台,包括IE6在内的老旧浏览器。这款插件采用JavaScript编写,同时结合HTML5、Flash、Silverlight和HTML4等多种技术,确保在各种环境下都能实现文件的上传...

    java+plupload多附件上传 servelet

    Java与Plupload结合实现多附件上传是一个常见的Web开发任务,主要涉及到前端的文件选择、上传逻辑和后端的文件接收、存储处理。Plupload是一款强大的跨浏览器文件上传组件,支持多种上传方式,如Flash、HTML5、...

    plupload大文件批量分片上传

    plupload的特点在于其支持大文件的分片上传。传统的文件上传方式可能因文件过大导致上传失败或者时间过长,而plupload将大文件切割成多个小块(通常称为“分片”),逐个上传并合并,这样不仅可以提高上传速度,还能...

    plupload文件批量上传工具

    Plupload是一款强大的、跨平台的文件上传工具,它支持多种浏览器和文件上传方式,包括拖拽上传、多选文件以及批量上传整个文件夹。在Java环境中,我们可以利用Plupload的特性来实现用户友好的文件上传功能,提升用户...

    基于SpringBoot的文件上传系统,前后端分离,单文件上传,多文件上传,大文件上传,断点续传,文件秒传,图片上传

    基于SpringBoot的文件上传系统,前后端分离,单文件上传,多文件上传,大文件上传,断点续传,文件秒传,图片上传 项目经过严格测试,确保可以运行! 采用前后端分离的方式进行开发,实现了几种常用的文件上传功能...

    plupload断点续传

    Plupload是一个开源的JavaScript文件上传组件,它支持多种浏览器,并且内置了断点续传功能。 **Plupload介绍** Plupload是一款强大的多浏览器兼容的文件上传插件,通过Flash、HTML5、Silverlight等多种技术实现文件...

    Plupload多文件上传(调整后)

    综上所述,"Plupload多文件上传(调整后)"项目是为了解决Struts2环境中大文件上传的问题,它利用了Plupload的分块上传和断点续传功能,同时可能优化了Servlet和Struts2的文件上传处理逻辑,以适应大文件的上传需求。...

Global site tag (gtag.js) - Google Analytics