文件的上传

文件的上传

上传:

1). 表单需要注意的 3 点

2). Struts2 的文件上传实际上使用的是 Commons FileUpload 组件, 所以需要导入

commons-fileupload-1.3.jar
commons-io-2.0.1.jar

3). Struts2 进行文件上传需要使用 FileUpload 拦截器

4). 基本的文件的上传: 直接在 Action 中定义如下 3 个属性, 并提供对应的 getter 和 setter

//文件对应的 File 对象
private File [fileFieldName];
//文件类型
private String [fileFieldName]ContentType;
//文件名
private String [fileFieldName]FileName;

5). 使用 IO 流进行文件的上传即可.

6). 一次传多个文件怎么办 ?

若传递多个文件, 则上述的 3 个属性, 可以改为 List 类型! 多个文件域的 name 属性值需要一致.

7). 可以对上传的文件进行限制吗 ? 例如扩展名, 内容类型, 上传文件的大小 ? 若可以, 则若出错, 显示什么错误消息呢 ? 消息可以定制吗 ?

可以的!

可以通过配置 FileUploadInterceptor 拦截器的参数的方式来进行限制

maximumSize (optional) - 默认的最大值为 2M. 上传的单个文件的最大值

allowedTypes (optional) - 允许的上传文件的类型. 多个使用 , 分割

allowedExtensions (optional) - 允许的上传文件的扩展名. 多个使用 , 分割.

注意: 在 org.apache.struts2 下的 default.properties 中有对上传的文件总的大小的限制. 可以使用常量的方式来修改该限制

struts.multipart.maxSize=2097152

定制错误消息. 可以在国际化资源文件中定义如下的消息:

struts.messages.error.uploading - 文件上传出错的消息

struts.messages.error.file.too.large - 文件超过最大值的消息

struts.messages.error.content.type.not.allowed - 文件内容类型不合法的消息

struts.messages.error.file.extension.not.allowed - 文件扩展名不合法的消息

问题: 此种方式定制的消息并不完善. 可以参考 org.apache.struts2 下的 struts-messages.properties, 可以提供更多的定制信息.

 

使用struts2的上传文件功能,只需要使用普通的Action类,但是为了获取一些上传文件名文件类型,需要按照Action的规则在里面添加一些setter和getter方法。

在上传文件的时候,可以对文件的大小,文件的类型进行控制,在struts2中提供上传拦截器。该拦截器实现对上传文件的过滤作用。

 

 

1:导入架包

asm-3.3.jar
asm-commons-3.3.jar
asm-tree-3.3.jar
commons-fileupload-1.2.2.jar
commons-io-2.0.1.jar
commons-lang3-3.1.jar
freemarker-2.3.19.jar
javassist-3.11.0.GA.jar
ognl-3.0.5.jar
struts2-core-2.3.4.1.jar
xwork-core-2.3.4.1.jar

2:配置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_2_5.xsd" id="WebApp_ID" version="2.5">
<display-name>fileUD</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>


<!-- 定义Struts2的核心Filter -->
<filter>
<filter-name>struts</filter-name>
<filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
</filter>
<!-- 定义Struts2核心Filter拦截的URL -->
<filter-mapping>
<filter-name>struts</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- 配置Struts2的CleanUp的Filter -->
<filter>
<filter-name>struts-cleanup</filter-name>
<filter-class>org.apache.struts2.dispatcher.ActionContextCleanUp</filter-class>
</filter>
<!-- 定义Struts2的CleanUp Filter拦截的URL -->
<filter-mapping>
<filter-name>struts-cleanup</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>




</web-app>

3:编写struts.xml

<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">

<struts>
   
    <!-- 指定国际化资源文件的baseName为globalMessages -->
 <constant name="struts.custom.i18n.resources" value="globalMessages"/>
 <!-- 设置该应用使用的解码集 -->
 <constant name="struts.i18n.encoding" value="GBK"/>
 <package name="lee" extends="struts-default">
  <!-- 配置处理文件上传的Action -->
  <action name="upload" class="action.UploadAction">
   <!-- 动态设置Action的属性值 -->
             <param name="savePath">/upload</param>
   <!-- 配置Struts2默认的视图页面 -->
   <result>/succ.jsp</result> 
  </action>
 </package>
</struts>

 

 

 

 

 

 

 

 

 

 

 

 

4:编写文件上传的页面:

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<!-- 为了完成文件上传,设置该表单的enctype属性为multipart/form-data。 -->
<form action="upload.action" method="post" enctype="multipart/form-data">
   文件标题:<input type="text" name="title" /><br>
   选择文件:<input type="file" name="upload" /><br>
 <input value="上传" type="submit" />
</form>
</body>
</html>

上传成功的界面:

<%@ page language="java" contentType="text/html; charset=utf-8"%>
<!-- 导入Struts2的标签库 -->
<%@taglib prefix="s" uri="/struts-tags"%>
<html>
    <head>
        <title>上传成功</title>
    </head>
    <body>
        上传成功!<br>
  <!-- 输出上传的表单里的文件标题属性 -->
  文件标题:<s:property value=" + title"/><br>
  <!-- 根据上传文件的文件名,在页面上显示上传的图片 -->
  文件为:<img src="<s:property value="'upload/' + uploadFileName"/>"/><br>
    </body>
</html>

 

action类的编写:

package action;

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

import org.apache.struts2.ServletActionContext;

import com.opensymphony.xwork2.ActionSupport;

public class UploadAction extends ActionSupport
{
 //封装文件标题请求参数的属性
 private String title;
 //封装上传文件域的属性
     private File upload;
 //封装上传文件类型的属性
     private String uploadContentType;
 //封装上传文件名的属性
    private String uploadFileName;
 //接受依赖注入的属性
     private String savePath;
 //接受依赖注入的方法
     public void setSavePath(String value)
 {
         this.savePath = value;
     }

 //返回上传文件的保存位置
     private String getSavePath() throws Exception 
 {
         return ServletActionContext.getRequest().getRealPath(savePath);
     }

 //文件标题的setter和getter方法
 public void setTitle(String title)
{
  this.title = title; 
 }
 public String getTitle()
{
  return (this.title); 
 }

 //上传文件对应文件内容的setter和getter方法
 public void setUpload(File upload) 
{
  this.upload = upload; 
 }
 public File getUpload() 
{
  return (this.upload); 
 }

 //上传文件的文件类型的setter和getter方法
 public void setUploadContentType(String uploadContentType) 
{
  this.uploadContentType = uploadContentType; 
 }

 public String getUploadContentType()
{
  return (this.uploadContentType); 
 }

 //上传文件的文件名的setter和getter方法
 public void setUploadFileName(String uploadFileName) 
{
  this.uploadFileName = uploadFileName; 
 }

 public String getUploadFileName()
{
  return (this.uploadFileName); 
 }

 @Override
    public String execute() throws Exception
 {
  //以服务器的文件保存地址和原文件名建立上传文件输出流
  FileOutputStream fos = new FileOutputStream(getSavePath() + "\\" + getUploadFileName());
  
//以上传文件建立一个文件上传流
  FileInputStream fis = new FileInputStream(getUpload());
  //将上传文件的内容写入服务器
  byte[] buffer = new byte[1024];
  int len = 0;
  while ((len = fis.read(buffer)) > 0)
  {
   fos.write(buffer , 0 , len);
  }
         return SUCCESS;
    }
}

 

 

 

 

 

posted on 2014-12-24 22:53  aicpcode  阅读(162)  评论(0编辑  收藏  举报

导航