Ubuntu开发Struts2应用(4、文件上传)

2012年01月21日 JAVA, Linux, Ubuntu 暂无评论

文件上传这个功能在项目应用是非常常见的,这节说说Struts2如何实现文件上传。

Struts2使用开源项目Apache Jakarta Commons FileUpload和内建的FileUploadInterceptor拦截器实现文件上传

下面介绍代码:

FileUploadAction

  

package com.linuxsight.action;

import java.io.File;

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

import com.opensymphony.xwork2.ActionContext;

public class FileUploadAction {

 private File upload;
 private String uploadFileName;
 private String uploadContentType;
 private String allowTypes;
 private String savePath;

 public String getSavePath() {
  return savePath;
 }

 public void setSavePath(String savePath) {
  this.savePath = savePath;
 }

 public File getUpload() {
  return upload;
 }

 public void setUpload(File upload) {
  this.upload = upload;
 }

 public String getUploadFileName() {
  return uploadFileName;
 }

 public void setUploadFileName(String uploadFileName) {
  this.uploadFileName = uploadFileName;
 }

 public String getUploadContentType() {
  return uploadContentType;
 }

 public void setUploadContentType(String uploadContentType) {
  this.uploadContentType = uploadContentType;
 }

 public String getAllowTypes() {
  return allowTypes;
 }

 public void setAllowTypes(String allowTypes) {
  this.allowTypes = allowTypes;
 }

 public String execute() throws Exception{

  String realpath = ServletActionContext.getServletContext().getRealPath(this.getSavePath());
  System.out.println("realpath---"+realpath);
  ActionContext.getContext().put("realpath",realpath);
  System.out.println("uploadFileName-----"+uploadFileName);

//判断是否允许上传
  String filterResult =filterType(this.getAllowTypes().split(","));
  System.out.println("filterResult:========="+filterResult);
  if(filterResult != null){
   ActionContext.getContext().put("error","上传的文件类型不正确");
   return filterResult;  
  }

  if(upload!=null){
   File savefile = new File(new File(realpath), uploadFileName);
   if(!savefile.getParentFile().exists()) {
    savefile.getParentFile().mkdirs();
   }
   FileUtils.copyFile(upload, savefile);

  }
  return "success";
 }

 public String filterType(String[] types){
  String fileType= this.getUploadContentType();
  for(String type:types){
   if(type.equals(fileType)){
    return null;
   }
  }
  return "input";
  }
  }

struts.properties(控制上传文件大小)

struts.multipart.maxSize=2097152

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>
     <!-- 文件上传 -->
     <package name="fileUpload"  extends="struts-default">
  <action name="fileUpload">
  <param name="allowTypes">
        image/pjpeg,image/bmp,image/jpg,image/png,image/gif,image/jpeg
        </param>
        <param name="savePath">/upload</param>
   <result>/WEB-INF/jsp/suc.jsp</result>
   <result name="input">/upload.jsp</result>
  </action>
 </package>
</struts>

upload.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>文件上传</title>
  </head>
  <h3>struts2文件上传</h3>
 <body>
 ${error }
    <form action="${pageContext.request.contextPath}/fileUpload" enctype="multipart/form-data" method="post">
     文件:<input type="file" name="upload">
     <input type="submit" value="上传"/>
    </form>
  </body>
</html>

suc.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>上传成功页面</title>
  </head>
  <h3>Struts2文件上传|Linux视野</h3>
  <body>
    恭喜,文件上传成功 <br>
   <b> 文件在ubuntu环境下的路径:</b><br>
   (其实在这里久可以看到ubuntu下tomcat的部署目录,该文件夹是隐藏的)
   <br>
    ${realpath }<br>
 <b>文件名:</b>${uploadFileName}<br>
 <b>文件类型:</b>${uploadContentType}<br>
     <!--  <img src="<s:property value="'upload/' + uploadFileName"/>" />
     <img alt="" src="${pageContext.request.contextPath}/upload/${uploadFileName }" />
     -->
     <img alt="${uploadFileName}" src="upload/${uploadFileName }" />
  
  </body>
</html>
注意:在文件上传过程中出现了一个警告

警告: Could not find action or result
There is no Action mapped for action name images/. - [unknown location]

所以我们在web.xml多加上一个ActionContextCleanUp的配置,就不会有警告了。这个类是一个filter,他的作用是方便strut2与sitemesh整合,与文件上传应没有关系,但不加却会出现莫名的警告。

<filter>
  <filter-name>struts-cleanup</filter-name>
  <filter-class>
  org.apache.struts2.dispatcher.ActionContextCleanUp
  </filter-class>
  </filter>
  <filter-mapping>
   <filter-name>struts-cleanup</filter-name>
   <url-pattern>/*</url-pattern>
  </filter-mapping><filter>
  <filter-name>struts-cleanup</filter-name>
  <filter-class>
  org.apache.struts2.dispatcher.ActionContextCleanUp
  </filter-class>
  </filter>
  <filter-mapping>
   <filter-name>struts-cleanup</filter-name>
   <url-pattern>/*</url-pattern>
  </filter-mapping>

实现效果图:

Ubuntu开发Struts2应用(4、文件上传)

给我留言