struts2实现批量上传和打包批量下载

原创 2016年06月01日 18:55:02

struts2框架虽然年久失修,但是作为web后台开发人员,什么框架都得懂点不是,最近研究下载,而struts2框架搭建起来十分容易,就用它实现吧

不得不说,有的框架文档写的十分详细,struts2的框架开发文档写的也不错,

详细解释大偶在代码中

web.xml配置struts2的过滤器,还是简单提一下

   <filter>
        <filter-name>struts2</filter-name>
        <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
    </filter>

    <filter-mapping>
        <filter-name>struts2</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

配置一下,上传拦截器中错误信息,采用国际化全局文件:app.zh_CN.properties

这里写图片描述

struts.messages.error.file.too.large=\u4E0A\u4F20\u6587\u4EF6\u592A\u5927\uFF0C\u4E0A\u4F20\u5931\u8D25\uFF01
struts.messages.error.content.type.not.allowed=\u4E0A\u4F20\u6587\u4EF6\u7C7B\u578B\u4E0D\u6B63\u786E\uFF0C\u4E0A\u4F20\u5931\u8D25\uFF01
struts.messages.error.uploading=\u4E0A\u4F20\u5931\u8D25

struts2.xml配置

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
    "http://struts.apache.org/dtds/struts-2.3.dtd">

<struts>

    <constant name="struts.enable.DynamicMethodInvocation" value="false" />
    <constant name="struts.devMode" value="false" />
<!--     国际化文件开头 -->
    <constant name="struts.custom.i18n.resources" value="app"></constant>
<!--    multipart上传缓存路径 -->
    <constant name="struts.multipart.saveDir" value="F:\cache"></constant>
    <package name="default" namespace="/" extends="struts-default">
<!--     批量上传 -->
            <action name="upload" class="com.leige.action.UploadAction">
                    <result name="success">/index2.jsp</result>
                <result name="input">/index2.jsp</result>
                    <!-- 配置拦截器限制上传文件类型及大小 -->
                    <interceptor-ref name="fileUpload">
                <!--    允许上传的类型 -->
                        <param name="allowedTypes">image/bmp,
                        image/x-png,image/gif,image/jpeg,image/png, image/pjpeg
                        </param>
                        <param name="maximumSize">2097152</param>
                    </interceptor-ref>
                    <interceptor-ref name="defaultStack"></interceptor-ref>
            </action>
        <!--    单个上传 -->
            <action name="loadaction" class="com.leige.action.LoadAction">

                <result name="success" type="stream">
                    <!--    向浏览器说明流信息-->
                  <param name="contentType">application/octet-stream</param>
                         <!--   配置action返回输出流的名称-->
                  <param name="inputName">stream</param>
                         <!-- 配置请求头内容-->
                  <param name="contentDisposition">attachment;filename="${filename}"</param>
                         <!-- 配置缓存大小-->
                  <param name="bufferSize">1024*1024</param>
                </result>
            </action>
        <!--    批量打包下载 -->
                <action name="BatchLoadAction" class="com.leige.action.BatchLoadAction">

                <result name="success" type="stream">
                  <param name="contentType">application/octet-stream</param>
                  <param name="inputName">stream</param>
                  <param name="contentDisposition">attachment;filename="file.zip"</param>
                  <param name="bufferSize">1024*1024</param>
                </result>
            </action>
    </package>


</struts>

前台页面编写

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib uri="/struts-tags" prefix="s"%>
<%
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>My JSP 'index.jsp' starting page</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" type="text/css" href="styles.css">
    -->

  </head>

  <body>
//错误信息显示
  ${msg }
///  国际化错误显示
  <s:fielderror></s:fielderror>
  批量上传
  <form action="<%=basePath %>/upload.action" method="post" enctype="multipart/form-data">
  <input type="file" name="file">
    <input type="file" name="file">
      <input type="file" name="file">
        <input type="file" name="file">
  <input type="submit" value="上传">
  </form>

  <hr/>
  批量下载
   <form action="<%=basePath%>/BatchLoadAction.action" method="get">
        <input type="checkbox"  name="filename" value="img1.jpg">Image2
        <input type="checkbox"  name="filename" value="img2.jpg">Image3
        <input type="checkbox"  name="filename" value="img3.jpg">Image4
        <input type="submit" value="下载">
     </form> 

     单个文件下载:
         <a href="<%=basePath%>/loadaction.action?filename=易宝.png">下载</a>
  </body>
</html>

批量上传action代码

package com.leige.action;

import java.io.File;
import java.util.List;

import javax.servlet.ServletContext;

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

import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;


public class UploadAction extends ActionSupport {
/*  strut2中文件上传的定义规则是,
 * file:表单文name属性
 * fileFileName:文件名称
 * fileContentType:文件类型
 * */
    //接收文件
    private List<File> file;
    //接收文件名称
    private String[] fileFileName;
    //接收文件类型
    private String[] fileContentType;




    public List<File> getFile() {
        return file;
    }




    public void setFile(List<File> file) {
        this.file = file;
    }


    public String[] getFileFileName() {
        return fileFileName;
    }


    public void setFileFileName(String[] fileFileName) {
        this.fileFileName = fileFileName;
    }

    public String[] getFileContentType() {
        return fileContentType;
    }
    public void setFileContentType(String[] fileContentType) {
        this.fileContentType = fileContentType;
    }
//实现上传
    @Override
    public String execute() throws Exception {
        String path=ServletActionContext.getServletContext().getRealPath("/img");
    try{

        for(int i=0;i<file.size();i++){ 
            FileUtils.copyFile(file.get(i),new File(path,fileFileName[i]));
        }
    }catch (Exception e) {
        //出现异常自动返回input视图
        ActionContext.getContext().put("msg", "上传失败");
    return "input";
    }
        ActionContext.getContext().put("msg", "上传成功");
        return "success";
    }

}

struts2单个文件下载,action代码:

package com.leige.action;

import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.net.URLEncoder;

import javax.activation.MimetypesFileTypeMap;

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

import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;

public class LoadAction extends ActionSupport {

        private String filename;
        private InputStream stream;
        public String getFilename() {
            return filename;
        }
        public void setFilename(String filename) {
            this.filename = filename;
        }
        public InputStream getStream() {
            return stream;
        }           

        @Override
        public String execute() throws Exception {
        //获取下载路径
        String path=ServletActionContext.getServletContext().getRealPath("/img");
        //下载文件路径,文件名称重新编码,处理中文问题,当然如果配置了全局过滤器,就不用处理
          File downFile=new File(path,new String(filename.getBytes("ISO-8859-1"),"UTF-8"));       
             if(!downFile.exists()){
                 ActionContext.getContext().put("msg", "亲,您要下载的文件不存在");
                 return "success";
             }else{
                  //返回文件流信息
                stream = new FileInputStream(downFile);
                ActionContext.getContext().put("msg", "下载成功");
                return "success";
             }
        }


}

struts2多个文件批量打包下载,核心使用就是压缩流ZipOutputStream:

package com.leige.action;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.util.List;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
import java.util.zip.ZipOutputStream;

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

import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;

public class BatchLoadAction extends ActionSupport{
      //批量下载
      private List<String> filename;
      private InputStream stream;


    public List<String> getFilename() {
        return filename;
    }
    public void setFilename(List<String> filename) {
        this.filename = filename;
    }
    public InputStream getStream() {
        return stream;
    }

    @Override
    public String execute() throws Exception {
    //获取下载路径
    String path=ServletActionContext.getServletContext().getRealPath("/img");
     //注释换行符
        String str = "";
        String rt = "\r\n";
        //指定缓存路径
        File zipFile=new File(path,"temp.zip");
        //先把文件进行本地缓存
        ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(zipFile) );  
    for(int i=0;i<filename.size();i++){
            //下载文件路径,文件名称重新编码,处理中文问题,当然如果配置了全局过滤器,就不用处理
          String filenameChild=new String(filename.get(i).getBytes("ISO-8859-1"),"UTF-8");
           File downFile = new File(path,filenameChild);
            if(!downFile.exists()){
                     ActionContext.getContext().put("msg", "亲,您要下载的文件不存在");
                     return "success";
                 }else{
                     //生成注释
                    str += filenameChild + rt;
                    zos.putNextEntry(new ZipEntry(filename.get(i)));
                    FileInputStream fis = new FileInputStream(downFile);
                    //复制文件到压缩流中
                    IOUtils.copy(fis, zos);     
                    zos.flush();
                    fis.close();
                 }       
    }

                //设置注释,执行到这里说明压缩流已生成
                zos.setComment("下载成功:" + rt +  new String(str.getBytes("UTF-8"),"GBK"));
                zos.flush();
                zos.close();
                stream=FileUtils.openInputStream(zipFile);
                //删除缓存文件
                if(zipFile.exists())zipFile.delete();

      ActionContext.getContext().put("msg", "下载成功");
        return "success";
    }


}

代码还有好多问题没有考虑到,打包下载时,有明显的延迟,可能是后台进行文件压缩耗时太长,不知道各位有什么解决办法没有

版权声明:本文为博主原创,要转载留个名先

相关文章推荐

struts2 实现文件批量上传

  • 2012年04月06日 16:05
  • 3.19MB
  • 下载

struts2实现多文件批量上传并手动拦截文件类型和大小

1、------------------------------------------jsp页面---------------------------------------------------...

Struts2实现文件批量上传

Struts2实现文件批量上传

文件信息批量导入数据库(Struts2实现文件上传,POI实现Excel文件读取并写入数据库) .

如题:文件信息的批量导入...... 项目中经常会遇到客户的一些单表信息的数据批量导入,也就是提供定制Excel表,再把Excel表中的数据提取到数据库的操作,其实实现起来很简单。以下是小菜鸟我的实...

基于jquery ajax 无刷新 文件批量上传插件 GooUploader整合struts2实现上传

今天下午安排了一个任务:要实现多文件上传,也就是批量上传文件。相信单个文件上传很多人都实现过,批量上传也有不少人实现过,我之前批量上传的做法是利用js或jquery来动态添加删除的。感觉在用户体验上也...
  • ocean_30
  • ocean_30
  • 2011年09月04日 19:19
  • 13654

struts2整合uploadify插件实现批量上传,上传成功后跳转并传递参数

  • yhhazr
  • yhhazr
  • 2012年03月03日 16:57
  • 5544

Struts2批量上传

  • 2013年09月08日 15:23
  • 5KB
  • 下载

Struts2批量上传文件

struts.xml                               409600     image/pjpeg,image/bmp,image/jpg,image/...

struts2结合uploadify-v3.1完成批量图片上传功能

最近需要做一个批量上传图片的功能 用了很多方法,有的很复杂,有的没有成功 最后用了uploadify,去网上下了个最新的3.1版本,但是网上多数都是2.×的例子,已经有很多配置不一样了。 所以有...
  • wjc1000
  • wjc1000
  • 2012年05月31日 17:21
  • 6952

JQUERY AJAX+STRUTS2批量上传文件

ACTION代码   package ul; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:struts2实现批量上传和打包批量下载
举报原因:
原因补充:

(最多只允许输入30个字)