简单介绍使用GooUploader.js实现批量上传文件的方法(使用struts2)

  最近的网站项目中需要实现上传pdf的功能,期间找了很多jquery的插件,都不能满足要求,最后找到GooUploader.js,由于自己是第一次接触上传文件的功能,虽然看了很多写地详细的博客,还是花了很长时间才应用到项目中,所以在这里自己总结一下。

  GooUploader.js插件是在swfupload.js基础上进行扩展的,有些比较好的特点:

  1. 支持批量文件上传;

  2. 上传文件时,选择文件后,可以选择单个文件上传,也可以选择批量文件上传;

  3. 开始上传文件后,可以取消单个文件上传,也可以取消批量文件上传;

  4. 可以利用flash插件进行进度监视,不需要编写后台代码进行进度检测;

  5. UI界面美观,可以自己定义每个按钮的显示文字;

  6. 实现了异步刷新效果;

  我的项目中使用插件的效果如下(图中“返回”按钮是我修改js文件后的效果,最后会介绍):

  下面开始介绍插件的具体使用方法:

  1. 首先要引入插件所用的js文件,GooUploader.js、swfupload.js、jquery.min.js,jquery版本为1.5.2,版本过高可能会出现问题,这也是这个插件我觉得不太好用的部分,不能使用高版本的juery,也有可能是我自己没有调试好,这一部分没有做过多研究。css样式文件为GooUploader.css

  2. 接着是定义一些插件的参数,代码如下:

var post_params = {
      folder : $($(t).next()).attr("id"),
      username : userInfo.userName
};
var upload_property = {
      width : 300,//宽度
      height : 300,//长度
      multiple : true,//是否批量上传
      file_types : "*.pdf",//文件过滤
      post_params : post_params,
      btn_add_text : "添加",//对应按钮文字
      btn_up_text : "上传",
      btn_cancel_text : "放弃",
      btn_clean_text : "清空",
      op_del_text : "单项删除",
      op_up_text : "单项上传",
      op_fail_text : "上传失败",
      op_ok_text : "上传成功",
      op_no_text : "取消上传",
      upload_url : "upload",
      flash_url : "/CloudPaper/swfupload.swf"
};

  一些属性的含义在注释中已经注明,很容易理解,需要着重说明的是调用后台函数的部分,我的项目中使用的是struts2框架,所以这里只介绍在struts2中的使用方法。代码中红色字体 "upload_url"处,为action的名字;"post_params"处,为需要传参的部分,而参数需要提前定义在变量中,格式在代码开始处,传参使用的是requset方式,所以后台参数获取为应使用对应方法。以下为我的项目中获取参数的方法。

String userName = request.getParameter("username");
String folderPath = request.getParameter("folder");

  属性中还有一点需要注意,最后一个属性flash_url应填写一个swfupload.swf文件的路径,这是为了检测进度显示所用,但是因为GooUploader.js插件中定义了缺省值,所以这里建议写上自己的绝对路径,否则可能会出现路径找不到的问题,我在这里耗费不少时间。

  3. 在页面中定义一个空的div,在调用生成函数即可,create_ret是返回结果,可以通过它获取一些属性,但我没用太多应用,这里不好做太多介绍,以免误导。函数的第一个参数为页面中的div对象,这里是通过取id的方式获取,后一个为上面定义过的属性。

var create_ret = $.createGooUploader($("#upload"),upload_property);

  4. 接下来写后台文件,以下代码是我找到的大牛博客中的一段代码,做了一小部分修改,给重名文件在原名后加一个数字。

  参考地址:http://blog.csdn.net/ocean_30/article/details/6747643

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.List;  

import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;  

import org.apache.commons.io.FileUtils;
import org.apache.struts2.ServletActionContext;

import com.opensymphony.xwork2.ActionSupport;

/**
 * @author fish
 */
public class UploadFile extends ActionSupport
{
    private List<File> Filedata; // 默认的客户端文件对象,命名不符合java规范fileData
    private List<String> FiledataFileName; // 客户端文件名
    private List<String> imageContentType; // 客户端文件名类型  

    public List<File> getFiledata()
    {
        return Filedata;
    }  

    public void setFiledata(List<File> filedata)
    {
        Filedata = filedata;
    }  

    public List<String> getFiledataFileName()
    {
        return FiledataFileName;
    }  

    public void setFiledataFileName(List<String> filedataFileName)
    {
        FiledataFileName = filedataFileName;
    }  

    public List<String> getImageContentType()
    {
        return imageContentType;
    }  

    public void setImageContentType(List<String> imageContentType)
    {
        this.imageContentType = imageContentType;
    }  

    @Override
    public String execute() throws Exception
    {
        if (Filedata == null || Filedata.size() == 0)
        {
            return null;
        }
        for (int i = 0; i < Filedata.size(); ++i)
        {
            HttpServletRequest request = ServletActionContext.getRequest(); // 获得ServletRequest对象

            String userName = request.getParameter("username");
            // 文件真名
            String fileName = FiledataFileName.get(i);
            int fileOrderNum=0;//用来计数重名文件

            long length = Filedata.get(i).length(); // 文件的真实大小
            long time = System.currentTimeMillis();  

            // 将上传的文件保存到服务器的硬盘上  

            InputStream is = new  BufferedInputStream(new FileInputStream(Filedata.get(i)));  

            System.out.println("path:"+ServletActionContext.getServletContext().getRealPath("/"));
            String tmpSaveFileName = ServletActionContext.getServletContext().getRealPath("/userFiles/" + userName + "/pdf" ) + File.separator + fileName;
            File tmpFile = new File(tmpSaveFileName);
            while(tmpFile.exists()) {
                fileOrderNum++;
                tmpSaveFileName = ServletActionContext.getServletContext().getRealPath("/userFiles/" + userName + "/pdf" ) + File.separator + fileName+"("+fileOrderNum+")";
                tmpFile = new File(tmpSaveFileName);
            }

            FileUtils.forceMkdir(tmpFile.getParentFile()); // 创建上传文件所在的父目录  

            OutputStream os = new BufferedOutputStream( new FileOutputStream(tmpFile));  

            int len = 0;
            byte[] buffer = new byte[500];  

            while (-1 != (len = is.read(buffer)))
            {
                os.write(buffer, 0, len);
            }
            is.close();
            os.flush();
            os.close();    return "success";
    }
}

  5. 最后配置struts2,前面已经说过,插件实现的是异步刷新,所以这里的返回只需要随便写一个真实存在的jsp即可,不会对返回有影响。

<action name="upload" class="com.UploadFile">
          <result name="success">/jsp/index.jsp</result>
</action>

  因为原插件中没有返回按钮,所以自己修改了GooUploader.js中的一小部分代码,加入了返回功能,在源码中找到this.$multiple,加入红色代码,可以在页面上加入返回按钮,如果想要修改显示图片,可以修改<b>标签的class。

if(this.$multiple){
        this.$btn_upload=$("<div class=‘upload_btn‘><div class=‘left‘></div><div><b class=‘upload‘>"+(property.btn_up_text||"Upload")+"</b></div><div class=‘right‘></div></div>");
        this.$btn_cancel=$("<div class=‘upload_btn‘ style=‘display:none‘><div class=‘left‘></div><div><b class=‘cancel‘>"+(property.btn_cancel_text||"Cancel")+"</b></div><div class=‘right‘></div></div>");
        this.$btn_clean=$("<div class=‘upload_btn‘ style=‘float:right‘><div class=‘left‘></div><div><b class=‘clean‘>"+(property.btn_clean_text||"Clean")+"</b></div><div class=‘right‘></div></div>");
        this.$btn_back=$("<div class=‘upload_btn‘ style=‘float:right‘><div class=‘left‘></div><div><b class=‘clean‘>"+"返回"+"</b></div><div class=‘right‘></div></div>");
        this.$div_btn.append(this.$btn_upload).append(this.$btn_cancel).append(this.$btn_clean).append(this.$btn_back);
}

  在源码中找到以下代码,加入红色代码,为上面添加的按钮绑定调用函数即可。

if(this.$multiple){
      this.$btn_upload.bind("click",{content:this.$content,fileList:this.$fileList,cancel:this.$btn_cancel},function(e){
        for(var key in e.data.fileList){
            var li=e.data.content.children("#"+key);
            if(li.children(".op_up").css("display")=="block"){
                inthis.$goon=li.attr("id");
                li.children(".op_up").click();
                this.style.display="none";
                e.data.cancel.css({display:"block"});
                break;
            }
        }
      });
      this.$btn_cancel.bind("click",{content:this.$content,fileList:this.$fileList},function(e){
        for(var key in e.data.fileList){
            var li=e.data.content.children("#"+key);
            if(li.children(".op_up").css("display")=="block"){
                li.children(".op_up").css("display","none");
                li.children(".op_del").css("display","none");
                li.children(".op_no").click();
            }
            else if(li.children(".op_no").css("display")=="block"){
                li.children(".op_no").click();
            }
        }
      });
      this.$btn_clean.bind("click",{swfUpload:this.$swfUpload,content:this.$content,fileList:this.$fileList},function(e){
        if(e.data.swfUpload.getStats().in_progress==0){
            for(var key in e.data.fileList){
                e.data.content.children("#"+key).remove();
                e.data.fileList[key]=null;
            }
        }
      });
      this.$btn_back.bind("click",function(e){      .......
      });
    }
时间: 2024-08-18 17:58:56

简单介绍使用GooUploader.js实现批量上传文件的方法(使用struts2)的相关文章

不带插件 ,自己写js,实现批量上传文件及进度显示

今天接受项目中要完成文件批量上传文件而且还要显示上传进度,一开始觉得这个应该不是很麻烦,当我在做的时候遇到了很多问题,很头疼啊. 不过看了别人写的代码,自己也测试过,发现网上好多都存在一些问题,并不是自己想要的.然后自己查阅各种资料,经过自己总结,最终完成了这个功能. 如果大家有什么问题可以提出来,一起交流,学习.有什么不对的地方也指出来,我也虚心学习.自己也是刚写博客,您们的赞是我写博客的动力,谢谢大家. 条件:我采用struts2,java ,ajax,FormData实现; 1.实现的逻辑

Android网络编程之使用HttpClient批量上传文件(二)AsyncTask+HttpClient并实现上传进度监听

请尊重他人的劳动成果,转载请注明出处: Android网络编程之使用HttpClient批量上传文件(二)AsyncTask+HttpClient并实现上传进度监听 运行效果图: 我曾在<Android网络编程之使用HttpClient批量上传文件>一文中介绍过如何通过HttpClient实现多文件上传和服务器的接收.在上一篇主要使用Handler+HttpClient的方式实现文件上传.这一篇将介绍使用AsyncTask+HttpClient实现文件上传并监听上传进度. 监控进度实现: 首先

jQuery之批量上传文件插件之一

$("#uploader").plupload({     /*常规设置*/     runtimes:'html5,flash,silverlight,html4',     url:'hyzx/seller/commPicUpload.action',     /*最大文件限制b, kb, mb, gb, tb */     max_file_size:'1mb',     /*是否生成唯一文件名,如果为true会为上传的文件唯一的文件名.*/     unique_names:t

Android网络编程之使用HttpClient批量上传文件

请尊重他人的劳动成果,转载请注明出处:Android网络编程之使用HttpClient批量上传文件 我曾在<Android网络编程之使用HTTP访问网络资源>一文中介绍过HttpCient的使用,这里就不在累述了,感兴趣的朋友可以去看一下.在这里主要介绍如何通过HttpClient实现文件上传. 1.预备知识: 在HttpCient4.3之前上传文件主要使用MultipartEntity这个类,但现在这个类已经不在推荐使用了.随之替代它的类是MultipartEntityBuilder. 下面

spring mvc 批量上传+文件上传

spring mvc 批量上传+文件上传 简单3步走.搞定! 上传文件成功后: 1 上传文件核心方法 public static String saveWebImgFile(MultipartFile imgFile){ String webFilePath = ""; if(imgFile.getSize() > 0 && isImage(imgFile.getContentType())){ FileOutputStream fos = null; try {

Nodejs学习笔记(八)--- Node.js + Express 实现上传文件功能(felixge/node-formidable)

目录 前言 formidable简介 创建项目并安装formidable 实现上传功能 运行结果 部分疑惑解析 写在之后 前言 前面讲了一个构建网站的示例,这次在此基础上再说说web的常规功能----文件上传,示例以一个上传图片的功能为例子 上传功能命名用formidable实现,示例很简单! PS:最近比较忙,距上一次更新已经比较久了^_^! formidable简介 nodejs原生实现上传还是比较麻烦,有兴趣的自已去参考一下网上有网友写的代码 这里选择了formidable,也是githu

转 Android网络编程之使用HttpClient批量上传文件 MultipartEntityBuilder

请尊重他人的劳动成果,转载请注明出处:Android网络编程之使用HttpClient批量上传文件 http://www.tuicool.com/articles/Y7reYb 我曾在<Android网络编程之使用HTTP访问网络资源>一文中介绍过HttpCient的使用,这里就不在累述了,感兴趣的朋友可以去看一下.在这里主要介绍如何通过HttpClient实现文件上传. 1.预备知识: 在HttpCient4.3之前上传文件主要使用MultipartEntity这个类,但现在这个类已经不在推

一个简单的jQuery插件ajaxfileupload实现ajax上传文件例子

页面代码:   <html>     <!-- 引入相关的js文件,相对路径  -->     <script type="text/javascript" src="js/jquery.js"></script>       <script type="text/javascript" src="js/ajaxfileupload.js"></script&g

Java Miniui实现批量上传文件demo 201906221520

可能需要的jar包: 需要miniui(类似easyui). Test2019062201.jsp <%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "