struts2实现文件上传(配置拦截器)

来源:互联网 发布:淘宝点立即购买就发货 编辑:程序博客网 时间:2024/05/06 08:18
http://blog.sina.com.cn/s/blog_77cb8363010177zb.html
知识点:
  配置fileUpload拦截器时,可为其指定2个参数:
  • allowedTypes :该参数指定允许上传的文件类型,多文件之间用英文(,)隔开;
  • maximumSize  :该参数指定允许上传的文件大小,单位是字节;
   通过配置fileUpload拦截器,可以轻松的实现文件过滤,当文件过滤失败后,系统自动转入input逻辑视图。
因此必须为该Action配置名为input的逻辑视图,除此之外,还必须显示的为该Action配置defaultStack的拦截
器引用;

  表单元素的enctype属性

    application/x-www-form-urlencoded :这是默认编码方式,它只处理表单里的value属性值,
采用这种编码方式的表单会将表单域的值处理成URL编码方式。

   multipart/form-data : 这种编码方式会以二进制流的方式来处理表单数据,这种编码方式
会把文件域指定文件内容页封装到请求参数里。

   text/plain :这种编码方式当表单的action属性为mailto:URL 的形式时比较方便,这种方式
主要适用于直接通过表单发送邮件的方式。

使用拦截器fileUpload为struts2内建的拦截器,作用在于限制文件类型和文件大小,
将文件写入到指定的目录的code还是需要自己实现。


第一步:struts.xml配置:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE struts PUBLIC
 "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
 "
http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
  
    <!-- 指定国际化资源文件的baseName为uploadFile-->
    <constant name="struts.custom.i18n.resources" value="uploadFile"></constant>
    <!-- 设置该应用使用的编码集为utf-8 -->
    <constant name="struts.i18n.encoding" value="utf-8"></constant>
   
 <package name="default" namespace="/" extends="struts-default" >
 
        <!-- 连接进入上传页面 -->
        <action name="uploadFile">
          <result>/WEB-INF/jsp/upload.jsp</result>
        </action>
       
        <!-- 显示上传结果页面 -->
        <action name="upload" class="org.struts.Upload" method="uploadFile">
       
           <!-- 配置名字为fileUpload的拦截器 -->
           <interceptor-ref name="
fileUpload">
             <!-- 配置允许上传的文件类型 -->
              <param name="allowedTypes">image/bmp,image/png,image/gif,
                 image/jpeg,image/pjpeg,image/x-png</param>
             <!-- 配置允许上传文件的大小(单位字节) -->
             <param name="maximumSize">80000</param>
           </interceptor-ref>
          
           <interceptor-ref name="defaultStack"></interceptor-ref>
          
           <!-- 动态设置保存文件的路径 (Action的属性值)-->
           <param name="savePath">/upload</param>
          
           <!-- 配置struts2的默认视图 -->
           <result>/WEB-INF/jsp/show.jsp</result>
          
           <!-- 配置struts2的逻辑input视图 -->
          <result name="input">/WEB-INF/jsp/upload.jsp</result>
        </action>
 </package>
</struts>
 


第二步:国际化资源文件uploadFile.properties配置:

 

 
第三步:web.xml配置:
 
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0"
 xmlns="
http://java.sun.com/xml/ns/javaee"
 xmlns:xsi="
http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="
http://java.sun.com/xml/ns/javaee
 http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
  <display-name></display-name> 
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
 
 <!-- 配置Struts2 框架的核心Filter-->
 <filter>
  <!-- 配置Struts2核心Filter的名字-->
  <filter-name>struts2</filter-name>
  <!-- 配置Struts2核心Filter的实现类-->
  <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
 </filter>
 <filter-mapping>
  <!-- 配置Struts2核心FilterDispatcher拦截所有用户请求-->
  <filter-name>struts2</filter-name>
  <url-pattern>/*</url-pattern>
 </filter-mapping>
 
</web-app>

 
第四步:Action配置Upload.java:
 
package org.struts;
 

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionSupport;
public class Upload extends ActionSupport{
 private String savePath; // 封装保存文件的路径目录
 private String title; // 封装上传文件的标题
 private File upload; // 封装上传文件的内容
 private String uploadContentType; // 封装上传文件类型
 private String uploadFileName; // 封装上传文件名
 public String getSavePath() {
  return ServletActionContext.getRequest().getRealPath(savePath);
 }
 public String getTitle() {
  return title;
 }
 public File getUpload() {
  return upload;
 }
 public String getUploadContentType() {
  return uploadContentType;
 }
 public String getUploadFileName() {
  return uploadFileName;
 }
 public void setSavePath(String savePath) {
  this.savePath = savePath;
 }
 public void setTitle(String title) {
  this.title = title;
 }
 public void setUpload(File upload) {
  this.upload = upload;
 }
 public void setUploadContentType(String uploadContentType) {
  this.uploadContentType = uploadContentType;
 }
 public void setUploadFileName(String uploadFileName) {
  this.uploadFileName = uploadFileName;
 }
 
 public String uploadFile () throws  Exception{
  
  //保存文件的地址
  FileOutputStream fos = new FileOutputStream(getSavePath()+"
\\"+uploadFileName);
  
  //获得上传文件流
  FileInputStream fis = new FileInputStream(upload);
  
  //将文件写入服务器
  byte[] buffer = new byte[1024];
  int len=0;
  while((len=fis.read(buffer))>0){
   fos.write(buffer,0,len);
  }
  return SUCCESS;
 }
}
 
第五步:上传页面代码:
 
  <body>
    <s:form action="upload.action"
 method="post"enctype="multipart/form-data" namespace="/">
     <s:textfield label="文件描述" name="title"></s:textfield>
     <s:file label="文件" name="upload"></s:file>
     <s:submit value="上传"></s:submit>
    </s:form>
  </body>
 
第六步:显示页面代码:
 
  <body>
      文件名:<s:property value="title"/><br/>
      文件:<img src="
<s:property value="'upload/'+uploadFileName"/>"/>
  </body>
 
最终的项目的目录结构如下:

0 0
原创粉丝点击