• 关于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

  • 相关阅读:
    织梦开发——相关阅读likeart应用
    织梦标签教程
    织梦专题调用代码
    HIT 2543 Stone IV
    POJ 3680 Intervals
    HIT 2739 The Chinese Postman Problem
    POJ 1273 Drainage Ditches
    POJ 2455 Secret Milking Machine
    SPOJ 371 Boxes
    HIT 2715 Matrix3
  • 原文地址:https://www.cnblogs.com/lichenwei/p/3927964.html
Copyright © 2020-2023  润新知