zoukankan      html  css  js  c++  java
  • 基于 Struts2 的单文件和多文件上传

    文件的上传下载是 Web 开发中老生常谈的功能,基于 Struts2 框架对于实现这一功能,更是能够给我们带来很多的便利。Struts2 已经有默认的 upload 拦截器。我们只需要写参数,它就会自动帮我们封装好。这篇我们就先来看一下基于 Struts2 的单文件和多文件上传。

    一、 单文件上传

    1.1 导 jar 包

    commons-fileupload-1.3.jar

    commons-io-2.0.1.jar

    commons-logging-1.1.3.jar

    freemarker-2.3.19.jar

    ognl-3.0.6.jar

    struts2-core-2.3.15.3.jar

    xwork-core-2.3.15.3.jar

    1.2 web.xml 配置 Struts2 核心过滤器

      1 <filter>
      2     <filter-name>struts2</filter-name>
      3     <filter-class>
      4          org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
      5     </filter-class>
      6 </filter>
      7 
      8 <filter-mapping>
      9     <filter-name>struts2</filter-name>
     10     <url-pattern>/*</url-pattern>
     11 </filter-mapping>

    1.3 JSP 文件上传页(注意 file 的 name 属性一定要与 Action 里面的 File 类型属性名一致

      1 <!-- 文件上传的必要前提:
      2     1.请求方式必须是post
      3     2.enctype属性的取值必须是multipart/form-data
      4     3.提供一个文件选择域 文件上传
      5  -->
      6 
      7 <s:form  action="upload.action" enctype="multipart/form-data">
      8 
      9      <s:file  name="myfile"  label="请选择文件"></s:file>
     10      <s:submit value  ="提交"></s:submit>
     11 
     12 </s:form>

    1.4 实现文件上传的 UploadAction

      1 package com.fhcq.action;
      2 
      3 import java.io.File;
      4 import javax.servlet.ServletContext;
      5 import org.apache.commons.io.FileUtils;
      6 import org.apache.struts2.ServletActionContext;
      7 import com.opensymphony.xwork2.ActionSupport;
      8 
      9 public class UploadAction extends ActionSupport  {
     10 
     11 	//表单上提供的字段
     12 	private File myfile;
     13 	//struts2在文件上传时提供的属性	
     14 	private String myfileFileName;//上传的文件名。上传字段名称+FileName  注意大小写
     15 	private String myfileContentType;//上传文件的MIME类型。上传字段名称+ContentType 注意大小写
     16 	public String upload (){
     17 
     18 		//1.拿到ServletContext
     19 		ServletContext servletContext = ServletActionContext.getServletContext();
     20 		//2.调用realPath方法,获取根据一个虚拟目录得到的真实目录	
     21 		String realPath = servletContext.getRealPath("/WEB-INF/file");
     22 	        //3.如果这个真实的目录不存在,需要创建
     23 		File file = new File(realPath );
     24 		if(!file.exists()){
     25 			file.mkdirs();
     26 		}
     27 		//4.把文件存过去
     28 		//拷贝:把文件的临时文件复制到指定的位置。注意:临时文件还在
     29 		//FileUtils.copyFile(myfile, new File(file,myfileFileName));
     30 
     31 		//剪切:把临时文件剪切指定的位置,并且给他重命名。 注意:临时文件没有了
     32 		myfile.renameTo(new File(file,myfileFileName));
     33 		return SUCCESS;
     34 	}
     35 
     36 	public File getMyfile() {
     37 		return myfile;
     38 	}
     39 
     40 	public void setMyfile(File myfile) {
     41 		this.myfile = myfile;
     42 	}
     43 
     44 	public String getMyfileFileName() {
     45 		return myfileFileName;
     46 	}
     47 
     48 	public void setMyfileFileName(String myfileFileName) {
     49 		this.myfileFileName = myfileFileName;
     50 	}
     51 
     52 	public String getMyfileContentType() {
     53 		return myfileContentType;
     54 	}
     55 
     56 	public void setMyfileContentType(String myfileContentType) {
     57 		this.myfileContentType = myfileContentType;
     58 	}
     59 
     60 }

    1.5 配置 struts.xml(注意:修改文件上传的总的大小。

      1 <struts>
      2      <!--constant修改struts2的默认配置值  -->
      3      <!--修改struct2称为开发模式,修改配置之后会自动加载  -->
      4      <constant name="struts.devMode" value="true" />
      5      <!-- 限制上传文件的大小,第一种方式:通过修改struts2的常量。
      6 		在default.properties中配的struts.multipart.maxSize=2097152-->
      7      <constant name="struts.multipart.maxSize" value="4097152" />
      8 
      9      <package name="p1"  extends="struts-default">
     10 
     11 	  <action  name ="upload" class = "com.fhcq.action.UploadAction" method="upload">
     12 
     13           <!-- 第二种方式:通过给fileUpload的拦截器注入参数的形式,控制上传文件的大小
     14           无法使用   <param name="fileUpload.maximumSize">31457280</param>-->
     15 	     <interceptor-ref name="defaultStack">
     16 	        <!-- 限制上传文件的扩展名。如果有多个,使用逗号分隔
     17 	        <param name="fileUpload.allowedExtensions">jpg,png,bmp</param>-->
     18 	        <!-- 限制上传文件的MIME类型。 如果有多个,使用逗号分隔 -->
     19                 <param name="fileUpload.allowedTypes">image/jpg,image/pjpeg,image/png
     20                 </param>
     21 	     </interceptor-ref>
     22 	     <result>/index.jsp</result>
     23 	     <result name="input" type="redirect">/upload.jsp</result>
     24 	  </action>
     25 
     26       </package>
     27 
     28 </struts>

    1.6 配置 fileupload_message.properties,放置在 src 下用来显示错误的资源文件信息

      1 struts.messages.error.content.type.not.allowed=u4E0Au4F20u6587u4EF6u7684u7C7Bu578Bu4E0Du662Fu88ABu652Fu6301u7684: {0} "{1}" "{2}" {3}

    二、 多文件上传

    在以上单文件上传的基础上,修改内容如下:

    2.1 JSP 文件上传页(注意 file 的 name 属性一定要与 Action 里面的 File 类型属性名一致

      1 <!-- 文件上传的必要前提:
      2     1.请求方式必须是post
      3     2.enctype属性的取值必须是multipart/form-data
      4     3.提供一个文件选择域
      5 -->
      6 
      7 <s:form  action="upload.action" enctype="multipart/form-data">
      8 
      9      <s:file  name="myfile"  label="请选择文件"></s:file>
     10      <s:file  name="myfile"  label="请选择文件"></s:file>
     11      <s:submit value  ="提交"></s:submit>
     12 
     13 </s:form>

    2.2 实现文件上传的 UploadAction

      1 package com.fhcq.action;
      2 
      3 import java.io.File;
      4 
      5 import javax.servlet.ServletContext;
      6 
      7 import org.apache.struts2.ServletActionContext;
      8 
      9 import com.opensymphony.xwork2.ActionSupport;
     10 
     11 public class UploadAction extends ActionSupport  {
     12 
     13 	//表单上提供的字段
     14 	private File[]   myfile;
     15 	//struts2在文件上传时提供的属性
     16 	private String[] myfileFileName;上传的文件名。上传字段名称+FileName  注意大小写
     17 	private String[] myfileContentType;//上传文件的MIME类型。上传字段名称+ContentType 注意大小写
     18 
     19 	public String upload (){
     20 
     21 		//1.拿到ServletContext
     22 		ServletContext servletContext = ServletActionContext.getServletContext();
     23 		//2.调用realPath方法,获取根据一个虚拟目录得到的真实目录
     24 		String realPath = servletContext.getRealPath("/WEB-INF/files");
     25 		//3.如果这个真实的目录不存在,需要创建
     26 		File file = new File(realPath );
     27 		if(!file.exists()){
     28 			file.mkdirs();
     29 		}
     30 		//4.把文件存过去
     31 		//剪切:把临时文件剪切指定的位置,并且给他重命名。 注意:临时文件没有了
     32 		for(int i=0;i<myfile.length;i++){
     33 			myfile[i].renameTo(new File(file,myfileFileName[i]));
     34 		}
     35 
     36 		return SUCCESS;
     37 	}
     38 
     39 	public File[] getMyfile() {
     40 		return myfile;
     41 	}
     42 
     43 	public void setMyfile(File[] myfile) {
     44 		this.myfile = myfile;
     45 	}
     46 
     47 	public String[] getMyfileFileName() {
     48 		return myfileFileName;
     49 	}
     50 
     51 	public void setMyfileFileName(String[] myfileFileName) {
     52 		this.myfileFileName = myfileFileName;
     53 	}
     54 
     55 	public String[] getMyfileContentType() {
     56 		return myfileContentType;
     57 	}
     58 
     59 	public void setMyfileContentType(String[] myfileContentType) {
     60 		this.myfileContentType = myfileContentType;
     61 	}
     62 
     63 }
  • 相关阅读:
    代码—五天前是星期几
    随手笔记-日期
    建造曲线记忆表格
    2017-5-10随手记
    java-web——第一课 tomcat
    复习
    Leetcode 24. Swap Nodes in Pairs(详细图解一看就会)
    这可能是最详细的解析HTTP走私攻击的文章
    使用grub2引导进入Linux或Window系统
    ACM集训第一次积分赛赛前复习+day4
  • 原文地址:https://www.cnblogs.com/justlove/p/6817276.html
Copyright © 2011-2022 走看看