(七)Struts2文件上传

来源:互联网 发布:windows xp sp3 编辑:程序博客网 时间:2024/04/29 19:15

单文件上传的upload.jsp页面

<%@ page language="java" pageEncoding="utf-8" contentType="text/html; charset=utf-8"%><%@ taglib uri="/struts-tags"   prefix="s"%><html>  <head>    <title>My JSP 'index.jsp' starting page</title>    </head>  <body>    <form action="${pageContext.request.contextPath}/upload/uploadAction_saveFile.action"            name="form1"  method="post"  enctype="multipart/form-data" >                          上传文件名称:<input type="file" name="uploadImage">           <input type="submit" value="上传">    </form>  </body></html>

对应的UploadAction

package cn.yht.upload;import java.io.File;import java.io.IOException;import javax.servlet.ServletContext;import javax.servlet.http.HttpServletRequest;import org.apache.commons.io.FileUtils;import org.apache.struts2.ServletActionContext;import com.opensymphony.xwork2.ActionSupport;@SuppressWarnings("serial")public class UploadAction extends ActionSupport {/* * 上传文件的存储的临时文件: * E:\\TOOLS\\apache-tomcat-6.0.35\\work\\Catalina\\localhost\\itcast1105_struts\\upload__5fee1dc7_13ad3d1835b__8000_00000000.tmp */private File uploadImage;//上传文件的类型:text/plainprivate String uploadImageContentType;//上传文件的真是名称private String uploadImageFileName;public File getUploadImage() {return uploadImage;}public void setUploadImage(File uploadImage) {this.uploadImage = uploadImage;}public String getUploadImageContentType() {return uploadImageContentType;}public void setUploadImageContentType(String uploadImageContentType) {this.uploadImageContentType = uploadImageContentType;}public String getUploadImageFileName() {return uploadImageFileName;}public void setUploadImageFileName(String uploadImageFileName) {this.uploadImageFileName = uploadImageFileName;}public String saveFile(){System.out.println("UploadAction *********** saveFile()");ServletContext sc = ServletActionContext.getServletContext();String path = sc.getRealPath("/fileupload");File file = new File(path, uploadImageFileName);try {FileUtils.copyFile(uploadImage, file);} catch (IOException e) {e.printStackTrace();}uploadImage.delete();return "success";}}

多文件上传的uploads.jsp页面

<%@ page language="java" pageEncoding="utf-8" contentType="text/html; charset=utf-8"%><%@ taglib uri="/struts-tags"   prefix="s"%><html>  <head>    <title>My JSP 'index.jsp' starting page</title>    </head>  <body>    <form action="${pageContext.request.contextPath}/upload/uploadsAction_saveFiles.action"            name="form1"  method="post"  enctype="multipart/form-data" >             上传文件名称:<input type="file" name="uploadImages"><br>             上传文件名称:<input type="file" name="uploadImages"><br>             上传文件名称:<input type="file" name="uploadImages"><br>                            <input type="submit" value="上传">    </form>  </body></html>

对应的UploadsAction

package cn.yht.upload;import java.io.File;import java.io.IOException;import javax.servlet.ServletContext;import org.apache.commons.io.FileUtils;import org.apache.struts2.ServletActionContext;import com.opensymphony.xwork2.ActionSupport;@SuppressWarnings("serial")public class UploadsAction extends ActionSupport {private File [] uploadImages;private String [] uploadImagesContentType;private String [] uploadImagesFileName;public String saveFiles(){System.out.println("UploadsAction ******** saveFiles()");ServletContext sc = ServletActionContext.getServletContext();String path = sc.getRealPath("/fileupload");for(int i=0;i<uploadImages.length;i++){File file = new File(path, uploadImagesFileName[i]);try {FileUtils.copyFile(uploadImages[i], file);} catch (IOException e) {e.printStackTrace();}uploadImages[i].delete();}return "success";}public File[] getUploadImages() {return uploadImages;}public void setUploadImages(File[] uploadImages) {this.uploadImages = uploadImages;}public String[] getUploadImagesContentType() {return uploadImagesContentType;}public void setUploadImagesContentType(String[] uploadImagesContentType) {this.uploadImagesContentType = uploadImagesContentType;}public String[] getUploadImagesFileName() {return uploadImagesFileName;}public void setUploadImagesFileName(String[] uploadImagesFileName) {this.uploadImagesFileName = uploadImagesFileName;}}

对应的struts_upload.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="upload" namespace="/upload" extends="struts-default"><action name="uploadAction_saveFile" class="cn.yht.upload.UploadAction" method="saveFile"><result name="success">/upload/success.jsp</result><result name="input">/upload/error.jsp</result><!-- 配置拦截器的参数,这里是文件上传拦截器 --><interceptor-ref name="defaultStack">              <!--               配置文件上传拦截器的参数              * 与定义参数的顺序无关              * 允许的类型(allowedTypes)和允许的扩展名(allowedExtensions)必须保持一致               -->              <!--               * 配置上传文件的大小              * struts.xml文件中配置的是上传文件的总大小              * 这里配置的是上传文件的单个大小               -->              <param name="fileUpload.maximumSize">20971520</param>              <!-- 配置上传文件允许的类型,如果配置多个值的话,用","隔开 -->              <param name="fileUpload.allowedTypes">text/plain,application/msword</param>              <!-- 配置上传文件的扩展名,如果配置多个值的话,用","隔开 -->              <param name="fileUpload.allowedExtensions">.txt</param>            </interceptor-ref></action><action name="uploadsAction_saveFiles" class="cn.yht.upload.UploadsAction" method="saveFiles"><result name="success">/upload/success.jsp</result><result name="input">/upload/error.jsp</result></action></package></struts>

总结:

struts2框架的文件上传:
 * 单文件上传:
  * 在动作类action中声明相关属性:
   * 在动作类action中,要声明与页面中表单name属性同名的属性,同名的属性的类型时File类型;
   * 在动作类action中,要声明[同名的属性]ContentType,类型时String类型;
   * 在动作类action中,要声明[同名的属性]FileName,类型时String类型
   * 给所有属性提供get和set方法
  * 在业务方法中,处理文件上传:
   * 获取要上传文件的路径,保存的位置
   * 在目标文件夹内,创建一个与上传文件同名的文件
   * 通过FileUtils工具类提供copyFile()方法,将临时文件内容拷贝到目标文件夹下的那个同名的文件
  * 设置上传文件的总大小
   * 在struts.xml文件中,<constant name="struts.multipart.maxSize" value="2097152000"></constant>
  * 设置上传文件的大小、类型和扩展名:
   * 在自定义的配置文件中,在action标签下:
    <!-- 配置拦截器的参数,这里是文件上传拦截器 -->

    <interceptor-ref name="defaultStack">                <!--                  配置文件上传拦截器的参数                  * 与定义参数的顺序无关                  * 允许的类型(allowedTypes)和允许的扩展名(allowedExtensions)必须保持一致                 -->                <!--                  * 配置上传文件的大小                  * struts.xml文件中配置的是上传文件的总大小                  * 这里配置的是上传文件的单个大小                 -->                <param name="fileUpload.maximumSize">20971520</param>                <!-- 配置上传文件允许的类型,如果配置多个值的话,用","隔开 -->                <param name="fileUpload.allowedTypes">text/plain,application/msword</param>                <!-- 配置上传文件的扩展名,如果配置多个值的话,用","隔开 -->                <param name="fileUpload.allowedExtensions">.txt</param>             </interceptor-ref>


          * 自定义上传文件的错误提示信息:
           * 在动作类action同目录下,创建一个名为fileuploadmessage.properties资源文件(名为自定义)
           * 改资源文件配置如下:

     struts.messages.error.uploading=Error uploading: {0}     struts.messages.error.file.too.large=File too large: {0} "{1}" "{2}" {3}     struts.messages.error.content.type.not.allowed=Content-Type not allowed: {0} "{1}" "{2}" {3}     struts.messages.error.file.extension.not.allowed=File extension not allowed: {0} "{1}" "{2}" {3}


 * 多文件上传:
  * 所有流程于配置都与单文件上传一致。
  * 需要注意的是:
   * 在页面中,虽然是多文件上传,但是页面中表单的name属性的值必须保持一致;
   * 在动作类action中声明的相关属性,类型改成数组;
   * 在业务方法中,相关处理流程改成单文件上传的循环。
  


 

 

原创粉丝点击