天天看点

struts2单文件上传

文件上传几乎是所有web应用实现的一个必须模块。文件上传的实现需要将表单元素属性enctype的值设置为multipart/form-data,使表单数据以二进制编码方式提交。

struts2对文件上传的支持:

struts2文件上传需要commons-fileupload-x.x.x.jar和commons-io-x.x.x.jar两个包。

文件上传方法一:

所有action的父类:BaseAction.java:

package com.web.action;

import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.struts2.interceptor.ApplicationAware;
import org.apache.struts2.interceptor.ServletRequestAware;
import org.apache.struts2.interceptor.ServletResponseAware;
import org.apache.struts2.interceptor.SessionAware;

import com.opensymphony.xwork2.ActionSupport;

//所有action的父类
@SuppressWarnings("serial")
public class BaseAction extends ActionSupport implements ServletRequestAware,ServletResponseAware,SessionAware,ApplicationAware{

    HttpServletRequest request;
    HttpServletResponse response;
    Map<String, Object> session;
    Map<String, Object> application;
    public void setApplication(Map<String, Object> arg0) {
        this.application=arg0;
    }
    public void setSession(Map<String, Object> arg0) {
        this.session=arg0;
    }
    public void setServletResponse(HttpServletResponse arg0) {
        this.response=arg0;
    }
    public void setServletRequest(HttpServletRequest arg0) {
        this.request=arg0;
    }
}
           

文件上传页面:index.jsp:

<h2>单文件上传示例一</h2>
    <s:form action="OneFileUploadAction!uploadFile.action" method="post" enctype="multipart/form-data">
      <s:textfield name="userInfo.uname" label="姓名"></s:textfield>
      <s:file name="upload" label="照片"></s:file>
      <s:textfield name="userInfo.age" label="年龄"></s:textfield>
      <s:radio list="#{1:'男',2:'女'}" name="userInfo.sex" label="性别" value="1"></s:radio>
      <s:submit value="提交"></s:submit>
    </s:form>
           

文件上传的action:OneFileUploadAction.java:

package com.web.action;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

import com.web.entity.UserInfo;

//单文件上传使用的action
//使用老方法
@SuppressWarnings("serial")
public class OneFileUploadAction extends BaseAction{
    private File upload;              //封装上传文件域的属性
    private String uploadContentType; //封装上传文件的类型
    private String uploadFileName;    //封装上传文件的名称
    private UserInfo userInfo;        //创建UserInfo的对象userInfo

//set and get 方法省略
   
    public String uploadFile(){
        try {
            //获取文件上传的完整路径
            String path=request.getSession().getServletContext().getRealPath("/")+"upload/"+uploadFileName;
            //创建输出流,接收从输入流转过来的文件并存到制定的文件路径下
            FileOutputStream out=new FileOutputStream(path);
            //创建输入流,接收页面传过来的file文件
            FileInputStream in=new FileInputStream(upload);
            //创建缓冲区
            byte[] b=new byte[1024*1024*10];
            //存放缓冲区长度
            int len=0;
            while((len=in.read(b))!=-1){
                //循环将输入流中的内容写到输出流
                out.write(b, 0, len);
            }
            //关闭输入输出流
            in.close();
            out.close();
            userInfo.setPhoto("upload/"+uploadFileName);
            return SUCCESS;
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return null;
    }   
}
           

实体类:UserInfo.java:

package com.web.entity;
public class UserInfo {
    private String uname;
    private String photo;
    private int age;
    private int sex;
    public UserInfo() {
        super();
        // TODO Auto-generated constructor stub
    }
    public UserInfo(String uname, String photo, int age, int sex) {
        super();
        this.uname = uname;
        this.photo = photo;
        this.age = age;
        this.sex = sex;
    }
    //set and get 方法省略
}
           

struts.xml配置文件:

<struts>
    <constant name="struts.devMode" value="true"></constant>
    <!-- 配置包元素 -->
    <package name="default" extends="struts-default" namespace="/">
      <action name="OneFileUploadAction" class="com.web.action.OneFileUploadAction">
        <result name="success">/success.jsp</result>
        <result name="input">/index.jsp</result>
      </action>
    </package>
</struts>
           

成功显示页面:success.jsp:

<body>
    <h2>注册成功显示用户信息</h2>
    姓名:<s:property value="userInfo.uname"/>
    年龄:<s:property value="userInfo.age"/>
    性别:<s:if test="userInfo.sex">
                               男
     </s:if>
     <s:else>
                               女
     </s:else>
       头像:<img src="upload/<s:property value="uploadFileName"/>" alt="暂无图片" width="50px" height="50px" />
  </body>
           

文件上传方法二:

文件上传的action:OneFileUploadAction1.java :

package com.web.action;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

import org.apache.struts2.ServletActionContext;

import com.web.entity.UserInfo;

//新方法单文件上传
@SuppressWarnings("serial")
public class OneFileUploadAction1 extends BaseAction{
    private static final int BUFFER_SIZE=40*40;
    private File upload;            //封装上传文件域的属性
    private String uploadContentType; //封装文件上传的类型
    private String uploadFileName;    //封装上传文件名
    private String savePath;          //封装上传文件的保存路径
    private UserInfo userInfo;        //创建UserInfo的对象userInfo

//set and get方法省略.......
   
    //将源文件复制成目标文件
    private static void copy(File source,File target){
        InputStream in=null;  //声明一个输入流
        OutputStream out=null;//声明一个输出流
       
        try {
            //实例化输入流
            in=new BufferedInputStream(new FileInputStream(source), BUFFER_SIZE);
            //实例化输出流
            out=new BufferedOutputStream(new FileOutputStream(target), BUFFER_SIZE);
            //定义字节数组buffer,作为缓冲区
            byte[] buffer=new byte[BUFFER_SIZE];
            //定义临时参数对象
            int len=0;
            while((len=in.read(buffer))>0){
                //如果上传文件字节数大于0
                //将内容以字节形式写入
                out.write(buffer, 0, len);
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            //先检测输入流关了没有,如果没关,先关闭输入流
            if(in!=null){
                try {
                    in.close();
                } catch (IOException e) {
                    System.out.println("关闭输入流失败!");
                    e.printStackTrace();
                }
            }
            //再检测输出流关闭没有,如果没关闭,就关闭输出流
            if(out!=null){
                try {
                    out.close();
                } catch (IOException e) {
                    System.out.println("关闭输出流失败!");
                    e.printStackTrace();
                }
            }
        }   
    }
   
    public String uploadFile(){
        //根据服务器的文件保存地址和源文件名创建目录文件全路径
        String path=request.getSession().getServletContext().getRealPath("/")+"upload/"+uploadFileName;
        //将上传的文件名称赋值给userInfo对象的photo属性
        userInfo.setPhoto(this.getUploadFileName());
        //定义目标文件对象
        File target=new File(path);
        //调用copy方法实现文件写入
        copy(this.upload, target);
       
        return SUCCESS;
    }
}
           

配置文件:struts.xml(本配置文件实现了上传文件的过滤,比如:过滤上传文件的格式、上传文件的大小等):

<struts>
    <constant name="struts.devMode" value="false"></constant>
    <!-- 配置包元素 -->
    <package name="default" extends="struts-default" namespace="/">
      <action name="OneFileUploadAction" class="com.web.action.OneFileUploadAction1">
        <!-- 使用fileUpload拦截器 -->
        <interceptor-ref name="fileUpload">
          <!-- 显示上传文件的文件类型只能为图片 -->
          <param name="allowedTypes">image/pjpeg,image/x-jpeg,image/gif,image/bmp,image/jpeg</param>
          <!-- 制定允许上传文件的大小 -->
          <param name="maximumSize">1024*1024*10</param>
        </interceptor-ref>
        <!-- 配置默认系统拦截器 -->
        <interceptor-ref name="defaultStack"></interceptor-ref>
        <param name="savePath">/upload</param>
        <result name="success">/success.jsp</result>
        <result name="input">/index.jsp</result>
      </action>
    </package>
</struts>
           

实体类文件UserInfo.java,配置文件web.xml、上传页面index.jsp、成功显示页面success.jsp、所有action的父类BaseAction.java同方法一。

两种方法实现的页面:略......

继续阅读