struts2完美实现文件上传和下载

第一步:在webx项目lib目录下加入struts.jar包 
asm-3.3.jar 
asm-commons-3.3.jar 
asm-tree-3.3.jar 
commons-fileupload-1.3.1.jar 
commons-io-2.2.jar 
commons-lang3-3.2.jar 
freemarker-2.3.22.jar 
javassist-3.11.0.GA.jar 
log4j-api-2.2.jar 
log4j-core-2.2.jar 
ognl-3.0.6.jar 
struts2-core-2.3.24.1.jar 
struts2-dojo-plugin-2.3.24.1.jar 
xwork-core-2.3.24.1.jar

第二步配置web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://java.sun.com/xml/ns/javaee"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
    id="WebApp_ID" version="3.0">
    <display-name>Struts08</display-name>
    <!-- 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>*.action</url-pattern>
        <url-pattern>*.jsp</url-pattern>
    </filter-mapping>
    <!-- struts2配置-->

    <welcome-file-list>
        <welcome-file>index.jsp</welcome-file>
    </welcome-file-list>
</web-app>

第三步配置struts.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.i18n.encoding" value="utf-8" />
    <!-- 设置自动装载国际化 -->
    <constant name="struts.i18n.reload" value="true" />
    <!-- 设置动态方法调用 -->
    <constant name="struts.enable.DnamicMethodInvocation" value="true" />
    <!-- 设置开发模式 -->
    <constant name="struts.devMode" value="true" />
    <!-- 指定每次配置文件更改后,自动重新加载 -->
    <constant name="struts.configuration.xml.reload" value="true" />
    <!-- 设置访问方式 -->
    <constant name="struts.action.extension" value="action,," />
    <!-- 去除多余的格式 -->
    <constant name="struts.ui.theme" value="simple" />
    <!--设置上传文件大小20MB,默认为2MB大小 -->
    <constant name="struts.multipart.maxSize" value="20971520"></constant>

    <package name="default" extends="struts-default" namespace="/">
       <!-- 文件上传配置 -->
        <action name="m" class="com.action.UploadManyFile">
            <!-- 文件上传到user目录下-->
            <param name="path">/user</param>
            <param name="size">10240000</param>
        </action>
        <!-- 文件下载配置 -->
        <action name="down" class="com.action.FileDownloadAction">
        <param name="path">/user</param>
        <result name="success" type="stream">
        <param name="contentType">application/octet-stream</param>
        <param name="inputName">inputStream</param> 
        <param name="inputName">inputStream</param>
        <param name="contentDisposition">filename=${fn}</param>
        <param name="bufferSize">4096</param>
        </result>
        </action>
    </package>

</struts>

第四步jsp写入代码

<%@ page language="java" pageEncoding="UTF8"%>
<!Doctype html>
<html >
<head>
    <meta charset="UTF-8" />
    <title>struts2 多文件上传</title>
</head>
<body>
    <h1>struts-多文件 上传</h1>
    <form action="m.action" method="post" enctype="multipart/form-data">
    姓名:<input type="text" name="name" value="张三"><br>
    文件:<input type="file" name="fs"  multiple ><br>
    文件1:<input type="file" name="fs"  multiple ><br>
    文件2:<input type="file" name="fs"  multiple ><br>
    文件3:<input type="file" name="fs"  multiple ><br>
            <input type="submit"   value="上传"><br>
    </form>
    <hr>
    <h1>文件下载</h1>
     <a href="user/abc.jpg">下载</a>
     <a href="user/abc.rar">下载zip</a>
     <a href="down.action?fn=abc.rar">struts2文件下载</a>
</body>
</html>

第四步在src目录下建立UploadManyFile


import java.io.File;

import javax.servlet.ServletContext;

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

import com.opensymphony.xwork2.ActionSupport;

public class UploadManyFile  extends ActionSupport implements ServletContextAware{
    private String name;// 
    private File[] fs; //文件名
    private String [] fsFileName;
    private String[] fsContentType;//文件类型

    private String path;//文件路径
    private  int   size; //文件大小
    private ServletContext  ctx;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public File[] getFs() {
        return fs;
    }

    public void setFs(File[] fs) {
        this.fs = fs;
    }

    public String getPath() {
        return path;
    }

    public void setPath(String path) {
        this.path = path;
    }

    public int getSize() {
        return size;
    }

    public void setSize(int size) {
        this.size = size;
    }

    public String[] getFsFileName() {
        return fsFileName;
    }

    public void setFsFileName(String[] fsFileName) {
        this.fsFileName = fsFileName;
    }

    public String[] getFsContentType() {
        return fsContentType;
    }

    public void setFsContentType(String[] fsContentType) {
        this.fsContentType = fsContentType;
    }

    @Override
    public void setServletContext(ServletContext  ctx) {
               this.ctx=ctx;    
    }

    @Override
    public String execute() throws Exception {
          String p=ctx.getRealPath(path);
           File f=new File(p);
           if(!f.exists()){
               f.mkdirs();
           }
           for(int i=0;i<fs.length;i++){
            System.out.println(path);
            System.out.println(p);
            System.out.println(size);
            System.out.println(fs[i].length());
            System.out.println("------------");

            /* 
             * 如果文件大于上传限定值
             */
            if(fs[i].length()<size){
                FileUtils.copyFile(fs[i],new File(f,fsFileName[i]));
            }
           }
        return null;
    }

}

第五步建立FileDownloadAction

package com.action;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;

import org.apache.struts2.ServletActionContext;

import com.opensymphony.xwork2.Action;

public class FileDownloadAction implements Action {
    private String fn;  //文件名
    private String path;  //路径

    public String getFn() {
        return fn;
    }

    public void setFn(String fn) {
        this.fn = fn;
    }

    public String getPath() {
        return path;
    }

    public void setPath(String path) {
        this.path = path;
    }

    @Override
    public String execute() throws Exception {
        return SUCCESS;
    }
    public InputStream getInputStream() throws Exception{
        //获得路径和文件名
        String ip=ServletActionContext.getServletContext().getRealPath(path)+"/"+fn;
        InputStream is=new FileInputStream(ip);
        return is;
    }
}

第六步输入项目名称运行


        文件的上传下载是 Web 开发中老生常谈的功能,基于 Struts2 框架对于实现这一功能,更是能够给我们带来很多的便利。Struts2 已经有默认的 upload 拦截器。我们只需要写参数,它就会自动帮我们封装好。

一、 单文件上传

1.1 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>

1.2 JSP 文件上传页(注意 file 的 name 属性一定要与 Action 里面的 File 类型属性名一致

   <!-- 文件上传的必要前提:
       1.请求方式必须是post
       2.enctype属性的取值必须是multipart/form-data
       3.提供一个文件选择域 文件上传
    -->
   
   <s:form  action="upload.action" enctype="multipart/form-data">
   
        <s:file  name="myfile"  label="请选择文件"></s:file>
       <s:submit value  ="提交"></s:submit>
  
  </s:form>

1.3  实现文件上传的 UploadAction

   public class UploadAction extends ActionSupport  {
  
  	//表单上提供的字段
  	private File myfile;
  	//struts2在文件上传时提供的属性	
  	private String myfileFileName;//上传的文件名。上传字段名称+FileName  注意大小写
  	private String myfileContentType;//上传文件的MIME类型。上传字段名称+ContentType 注意大小写
  	public String upload (){
  
 		//1.拿到ServletContext
  		ServletContext servletContext = ServletActionContext.getServletContext();
  		//2.调用realPath方法,获取根据一个虚拟目录得到的真实目录	
  		String realPath = servletContext.getRealPath("/WEB-INF/file");
  	        //3.如果这个真实的目录不存在,需要创建
  		File file = new File(realPath );
  		if(!file.exists()){
  			file.mkdirs();
  		}
  		//4.把文件存过去
  		//拷贝:把文件的临时文件复制到指定的位置。注意:临时文件还在
  		//FileUtils.copyFile(myfile, new File(file,myfileFileName));
  
  		//剪切:把临时文件剪切指定的位置,并且给他重命名。 注意:临时文件没有了
  		myfile.renameTo(new File(file,myfileFileName));
  		return SUCCESS;
  	}
  
  	public File getMyfile() {
  		return myfile;
  	}
  
  	public void setMyfile(File myfile) {
 		this.myfile = myfile;
  	}
  
  	public String getMyfileFileName() {
  		return myfileFileName;
  	}
  
  	public void setMyfileFileName(String myfileFileName) {
  		this.myfileFileName = myfileFileName;
  	}
  
  	public String getMyfileContentType() {
  		return myfileContentType;
  	}
  
  	public void setMyfileContentType(String myfileContentType) {
  		this.myfileContentType = myfileContentType;
  	}
  
  }

1.4 配置 struts.xml(注意:修改文件上传的总的大小。

   <struts>
        <!--constant修改struts2的默认配置值  -->
        <!--修改struct2称为开发模式,修改配置之后会自动加载  -->
        <constant name="struts.devMode" value="true" />
        <!-- 限制上传文件的大小,第一种方式:通过修改struts2的常量。
   		在default.properties中配的struts.multipart.maxSize=2097152-->
        <constant name="struts.multipart.maxSize" value="4097152" />
   
        <package name="p1"  extends="struts-default">
  
  	  <action  name ="upload" class = "com.fhcq.action.UploadAction" method="upload">
  
            <!-- 第二种方式:通过给fileUpload的拦截器注入参数的形式,控制上传文件的大小
            无法使用   <param name="fileUpload.maximumSize">31457280</param>-->
  	     <interceptor-ref name="defaultStack">
  	        <!-- 限制上传文件的扩展名。如果有多个,使用逗号分隔
  	        <param name="fileUpload.allowedExtensions">jpg,png,bmp</param>-->
  	        <!-- 限制上传文件的MIME类型。 如果有多个,使用逗号分隔 -->
                  <param name="fileUpload.allowedTypes">image/jpg,image/pjpeg,image/png
                  </param>
  	     </interceptor-ref>
  	     <result>/index.jsp</result>
  	     <result name="input" type="redirect">/upload.jsp</result>
  	  </action>
  
        </package>
  
  </struts>

1.5 配置 fileupload_message.properties,放置在 src 下用来显示错误的资源文件信息

struts.messages.error.content.type.not.allowed=
\u4E0A\u4F20\u6587\u4EF6\u7684\u7C7B\u578B\u4E0D\u662F\u88AB\u652F\u6301\u7684: {0} "{1}" "{2}" {3}

 

二、 多文件上传

在以上单文件上传的基础上,修改内容如下:

2.1 JSP 文件上传页(注意 file 的 name 属性一定要与 Action 里面的 File 类型属性名一致

  <!-- 文件上传的必要前提:
       1.请求方式必须是post
       2.enctype属性的取值必须是multipart/form-data
       3.提供一个文件选择域
   -->
   
   <s:form  action="upload.action" enctype="multipart/form-data">
   
        <s:file  name="myfile"  label="请选择文件"></s:file>
       <s:file  name="myfile"  label="请选择文件"></s:file>
       <s:submit value  ="提交"></s:submit>
  
  </s:form>

2.2 实现文件上传的 UploadAction

 
  public class UploadAction extends ActionSupport  {
  
  	//表单上提供的字段
  	private File[]   myfile;
  	//struts2在文件上传时提供的属性
  	private String[] myfileFileName;上传的文件名。上传字段名称+FileName  注意大小写
  	private String[] myfileContentType;//上传文件的MIME类型。上传字段名称+ContentType 注意大小写
  
  	public String upload (){
  
  		//1.拿到ServletContext
  		ServletContext servletContext = ServletActionContext.getServletContext();
  		//2.调用realPath方法,获取根据一个虚拟目录得到的真实目录
  		String realPath = servletContext.getRealPath("/WEB-INF/files");
  		//3.如果这个真实的目录不存在,需要创建
  		File file = new File(realPath );
  		if(!file.exists()){
  			file.mkdirs();
  		}
  		//4.把文件存过去
  		//剪切:把临时文件剪切指定的位置,并且给他重命名。 注意:临时文件没有了
  		for(int i=0;i<myfile.length;i++){
  			myfile[i].renameTo(new File(file,myfileFileName[i]));
  		}
  
 		return SUCCESS;
  	}
  
  	public File[] getMyfile() {
  		return myfile;
  	}
  
  	public void setMyfile(File[] myfile) {
  		this.myfile = myfile;
  	}
  
 	public String[] getMyfileFileName() {
  		return myfileFileName;
  	}
  
  	public void setMyfileFileName(String[] myfileFileName) {
  		this.myfileFileName = myfileFileName;
  	}
  
  	public String[] getMyfileContentType() {
  		return myfileContentType;
  	}
  
  	public void setMyfileContentType(String[] myfileContentType) {
 		this.myfileContentType = myfileContentType;
  	}
  
  }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值