• 关于Struts2的文件上传


    要实现Struts2框架的文件上传,需要用到2个jar包

    1. commons-fileupload-1.2.2.jar
    2. commons-io-2.0.1.jar

    由于文件解析Struts2内部已经帮我们做好了,大大降低了开发难度,我们只需要在Action里设置好对应的参数,目录进行使用即可。

    来个小示例:

    upload.jsp

    这个页面的表单有三点需要注意的:

    1、表单必须使用post方式提交  2、表单编码类型 enctype="multipart/form-data"    3、<s:file label="上传文件:" name="upload"></s:file> name属性必须要写

     1 <%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>
     2 <%@ taglib prefix="s" uri="/struts-tags" %>
     3 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
     4 <html>
     5 <head>
     6 <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
     7 <title>上传文件示例</title>
     8 </head>
     9 <body>
    10 <s:actionerror/>
    11 <s:fielderror/>
    12 <s:form action="upload.action" theme="simple" namespace="/" method="post" enctype="multipart/form-data">
    13     <s:file label="上传文件:" name="upload"></s:file>
    14     <s:submit value="提交上传"></s:submit>
    15 </s:form>
    16 </body>
    17 </html>

    UploadAction.java

    这里有几个注意点:

    1、三个成员变量的命名是有规范的:

    private File upload里的的upoload一样要和你上传提交页面里的name属性值对应一致

    文件类型和文件名命名分别为:页面name属性值+ContentType,页面name属性值+FileName

    2、提供setter方法,以便接收对应的数据

    3、定义目标文件存放处,用commons-io-2.0.1.jar包提供的FileUtils工具类把上传文件复制到指定位置

     1 package com.lcw.struts2.upload;
     2 
     3 import java.io.File;
     4 import java.io.IOException;
     5 
     6 import org.apache.commons.io.FileUtils;
     7 import org.apache.struts2.ServletActionContext;
     8 
     9 import com.opensymphony.xwork2.ActionSupport;
    10 
    11 public class UploadAction extends ActionSupport {
    12     //<s:file label="上传文件:" name="upload"></s:file>
    13     private File upload;//命名应该和上传页面name属性值保持一致
    14     private String uploadContentType;//属性值+ContentType
    15     private String uploadFileName;//属性值+FielName
    16     
    17     public void setUpload(File upload) {
    18         this.upload = upload;
    19     }
    20 
    21     public void setUploadContentType(String uploadContentType) {
    22         this.uploadContentType = uploadContentType;
    23     }
    24 
    25     public void setUploadFileName(String uploadFileName) {
    26         this.uploadFileName = uploadFileName;
    27     }
    28 
    29     public String upload() {
    30         File destFile = new File(ServletActionContext.getServletContext()
    31                 .getRealPath("/uploads")
    32                 + "/" + uploadFileName);
    33         try {    
    34             //工具类
    35             FileUtils.copyFile(upload, destFile);
    36         } catch (IOException e) {
    37             e.printStackTrace();
    38         }
    39         return SUCCESS;
    40     }
    41 }

    struts.xml

     1 <?xml version="1.0" encoding="UTF-8"?>
     2 <!DOCTYPE struts PUBLIC
     3     "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
     4     "http://struts.apache.org/dtds/struts-2.0.dtd">
     5 <struts>
     6     <constant name="struts.devMode" value="true" />    
     7     <!-- 全局国际化配置 -->
     8     <constant name="struts.custom.i18n.resources" value="messages"></constant>
     9 
    10     <package name="struts2test" extends="struts-default">
    11         <action name="upload" class="com.lcw.struts2.upload.UploadAction" method="upload">
    12             <result name="success">/index.jsp</result>
    13             <result name="input">/upload.jsp</result>
    14         </action>
    15     </package>
    16 
    17 </struts>

    看下效果:

    到这里基本的上传操作已经完成了,下面来下关于上传文件的配置参数:

    首先我们打开Struts2的核心包文件:

    在这个文件里,我们可以找到一些关于Struts2的常量和默认参数设置

    其中我们可以看到2个参数:

    ①struts.multipart.saveDir    --默认的上传路径

    struts.multipart.maxSize=2097152    --默认上传文件的大小

    若我们想改变参数设置,我们可以在struts.xml里配置,例如改变上传文件大小限定..于此类推(这里改变的是全局设定)

    1 <constant name="struts.multipart.maxSize" value="200000"></constant>

    若我们想对单独的表单做设定,struts2的拦截器FileUpload有3个属性可以供我们选择

    ①fileUpload.maximumSize: 上传文件的最大长度(以字节为单位), 默认值为 2 MB
    ②fileUpload.allowedTypes: 允许上传文件的类型, 各类型之间以逗号分隔
    ③fileUpload.allowedExtensions: 允许上传文件扩展名, 各扩展名之间以逗号分隔

    关于参数,我们可以打开struts2的核心包里的struts-default.xml进行查看

    我们可以发现fielUpload拦截器处于Struts2默认的拦截栈里,并且可以发现这个拦截栈引用了workflow,调用Action的validate方法,一旦有错误返回,重新定位到INPUT页面

    例如:我们保持以上上传代码不变,在配置文件的Actin里添加:

    1 <interceptor-ref name="defaultStack">
    2                 <param name="fileUpload.allowedExtensions">.txt</param>
    3 </interceptor-ref>

    设置允许上传文件类型为txt,此时来看看效果:

    很明显,上传失败了,也就意味我们的配置文件限制起作用了。

    那么关于错误信息的回显

    1、 若我们是针对常量做设置,出错则跳转input 视图, 通过 <s:actionError /> 回显错误信息 

    2、若我们是对fileLoad做设置,出错则在页面通过 <s:fieldError /> 回显错误信息 

    例如上面出现的回显错误信息File extension not allowed,我们可以在struts2的核心jar的struts-messages.properties里找到

    其中的{0}{1}{2}{3}参数分别代表upload,"C和C++程序员的Lua快速入门.pdf" ,"upload__689312be_147f80f105d__8000_00000005.tmp" ,application/pdf

    我们可以来个国际化覆盖对应的key值,进行我们想要的回显信息:

    我上传一个word文件,看下此时的页面效果:

    搞定搞定,写博客还是蛮累的。。。关于Struts2的多文件上传请戳这里:http://www.cnblogs.com/lichenwei/p/3928200.html

  • 相关阅读:
    Kibana: missing authentication credentials for REST request
    MySQL命令速记
    VIM常用命令简记
    Linux常用命令简记
    袁永福的C#编程书籍,电子工业出版社出版。
    发布DCWriter电子病历文本编辑器
    袁永福的博客系列文章链接集合
    ssh隧道 的命令行和 sshd 服务的配置(gatePort)
    PureMVC(AS3)剖析:设计模式(二)
    Python应用与实践
  • 原文地址:https://www.cnblogs.com/lichenwei/p/3927964.html
Copyright © 2020-2023  润新知