Struts2学习之文件上传

栏目: Struts · 发布时间: 6年前

内容简介:我们在开发Web应用时,肯定要为用户提供上传的功能,比如用户上传一张图像作为头像等。为了能上传文件,我们必须将表单的method设置为POST,将enctype设置为Struts2并未提供自己的请求解析器,也就是说,Struts2不会自己去处理在Struts2的

前言

我们在开发Web应用时,肯定要为用户提供上传的功能,比如用户上传一张图像作为头像等。为了能上传文件,我们必须将表单的method设置为POST,将enctype设置为 multipart/form-data 。只有在这种情况下,浏览器才会把用户选择文件的二进制数据发送给服务器。这篇文章就对Struts2框架中的上传功能进行详细的总结。

Struts2的文件上传

Struts2并未提供自己的请求解析器,也就是说,Struts2不会自己去处理 multipart/form-data 的请求,它需要调用其它上传框架来解析二进制请求数据,但Struts2在原有的上传解析器基础上做了进一步封装,更进一步简化了文件上传。

在Struts2的 default.properties 配置文件中,可以看到这样的配置代码:

### Parser to handle HTTP POST requests, encoded using the MIME-type multipart/form-data
# struts.multipart.parser=cos
# struts.multipart.parser=pell
# struts.multipart.parser=jakarta-stream
struts.multipart.parser=jakarta
# uses javax.servlet.context.tempdir by default
struts.multipart.saveDir=
struts.multipart.maxSize=2097152

上述代码主要用于配置Struts2上传文件时的上传解析器。Struts2的封装隔离了底层文件上传组件的区别,开发者只要在此配置文件上传所使用的解析器,就可以轻松地在不同的文件上传框架之间切换。

Struts2默认使用 jakarta 上传解析器,当然了,如果你不喜欢,你也可以换成别的。下面就通过代码来实现一个简单的基于Struts2的文件上传功能。

实现文件上传的Action

前台页面:

<form action="upload" method="post" enctype="multipart/form-data">
    Title:<input type="text" name="title"><br>
    File:<input type="file" name="upload"><br>
    <input type="submit" value="submit">
</form>

Action类:

public class UploadAction extends ActionSupport
{
    private String title;
    private File upload;
    private String uploadContentType;
    private String uploadFileName;
    private String savePath;

    public void setSavePath(String value)
    {
        this.savePath = value;
    }

    private String getSavePath()
    {
        String realPath = ServletActionContext.getServletContext().getRealPath("/WEB-INF/" + savePath);
        return realPath;
    }

    public void setTitle(String value)
    {
        this.title = value;
    }

    public String getTitle()
    {
        return title;
    }

    public void setUpload(File value)
    {
        this.upload = value;
    }

    public File getUpload()
    {
        return upload;
    }

    public void setUploadContentType(String value)
    {
        this.uploadContentType = value;
    }

    public String getFileContentType()
    {
        return uploadContentType;
    }

    public void setUploadFileName(String value)
    {
        this.uploadFileName = value;
    }

    public String getUploadFileName()
    {
        return uploadFileName;
    }

    @Override
    public String execute() throws Exception
    {
        FileOutputStream fos = new FileOutputStream(getSavePath() + "\\" + getUploadFileName());
        FileInputStream fis = new FileInputStream(getUpload());
        byte[] buffer = new byte[1024];
        int len = 0;
        while ((len = fis.read(buffer)) > 0)
        {
            fos.write(buffer, 0, len);
        }
        fis.close();
        fos.close();
        return SUCCESS;
    }
}

struts.xml配置文件:

<package name="upload" extends="struts-default">
    <action name="upload" class="com.jellythink.practise.UploadAction">
        <param name="savePath">/upload</param>
        <result name="success">/success.jsp</result>
        <result name="input">/index.jsp</result>
    </action>
</package>

对于Action类中,包含了两个特别的属性:

  • uploadContentType
  • uploadFileName

这两个属性分别用于封装上传文件的文件名、上传文件的文件类型。对于Struts2来说,如果Form表单中包含一个name属性为xxx的文件域,则对应的Action需要使用三个属性来封装该文件域的信息:

  • 类型为File的xxx属性封装了该文件域对应的文件内容;
  • 类型为String的xxxFileName属性封装了该文件域对应的文件的文件名;
  • 类型为String的xxxContentType属性封装了该文件域对应的文件的文件类型。

通过上面的开发过程,可以看出通过Struts2实现文件上传确实是一件简单的事情。我们需要做的事情就是将文件域与Action中一个类型为File的属性关联,就可以轻松访问到上传文件的文件内容,至于Struts2如何使用Multipart解析器,对开发者完全透明。

手动实现文件过滤

很多时候,Web应用不允许用户自由上传,我们需要对用户上传的文件类型,文件大小进行限制,因此必须在文件上传过程中进行文件过滤。下面就先手动实现上传文件过滤。

在struts.xml中配置一个新的参数,表示支持的上传类型:

<param name="allowTypes">image/png,image/gif,image/jpeg</param>

在Action中添加验证函数:

// 进行验证
@Override
public void validate()
{
    String filterResult = filterType(getAllowTypes().split(","));
    if (filterResult != null)
    {
        addFieldError("upload", "您要上传的文件类型不正确!");
    }
}

public String filterType(String[] types)
{
    String fileType = getFileContentType();
    for (String type : types)
    {
        if (type.equals(fileType))
        {
            return null;
        }
    }

    return ERROR;
}

这只是实现了类型的判断,然后在根据File类的length()方法,来实现大小的验证。但是好麻烦,接下来就说一种更简单的说法。

拦截器实现文件过滤

Struts2提供了一个文件上传的拦截器,通过配置拦截器可以更轻松地实现文件过滤。Struts2中文件上传的拦截器 fileUpload ,为了让该拦截器起作用,只需要在该Action中配置该拦截器引用即可。

配置 fileUpload 拦截器时,可以为其指定两个参数:

  • allowedTypes :该参数指定允许上传的文件类型,多个文件类型之间以英文逗号隔开
  • maximumSize :该参数指定允许上传的文件大小,单位是字节
    <!-- 配置fileUpload拦截器 -->
    <interceptor-ref name="fileUpload">
        <param name="allowedTypes">image/png,image/gif,image/jpeg</param>
        <param name="maximumSize">20000000</param>
    </interceptor-ref>
    
    <!-- 配置系统默认的拦截器 -->
    <interceptor-ref name="defaultStack" />
    <result name="success">/success.jsp</result>
    <result name="input">/index.jsp</result>

这样子,修改配置就可以搞定的事情,比写一坨代码真的轻松多了。

配置错误信息

对于上传出现错误的情况,系统默认都是提示英文的错误信息,但是为了输出国际化的提示信息,这就需要在国际化的资源配置文件中增加以下两个key的消息定义:

  • struts.messages.error.content.type.not.allowed=上传文件类型不正确,请重新上传
  • struts.messages.error.file.too.large=您上传的文件太大,请重新上传

接下来就可以使用 <s:fielderror/> 来输出错误信息了。

文件上传的常量配置

在文章的开始,我们说到 default.properties 中的配置,其中有一个 struts.multipart.saveDir 配置,那么该配置项的具体作用是什么呢?

在Struts2执行文件上传的过程中,需要指定一个临时文件夹,用来存放上传过程中产生的临时文件;如果没有指定临时文件夹,系统默认使用 javax.servlet.context.tempdir ,在Tomcat安装路径下的 work/Catalina/localhost/ 路径下。而这个 struts.multipart.saveDir 就是配置临时文件的存放位置的。所以在开发的过程中,一定要注意该目录是否有读写权限哦。

还有一个 struts.multipart.maxSize 配置,该配置表示上传文件的大小,如果同时指定了这个配置和 fileUpload 拦截器的 maximumSize 属性,则先和 struts.multipart.maxSize 配置的比较,再和 fileUpload 拦截器的 maximumSize 属性比较,如果文件大小超过了 struts.multipart.maxSize 配置的,则会出现异常,并不会将Result转到input,这个一定要注意。

总结

这篇文章详细的总结了Struts2中的文件上传,内容有点多,基本都是手册上的内容,也罢,就当手册了。

果冻想,认真玩技术的地方。

2016年4月12日 于呼和浩特。


以上所述就是小编给大家介绍的《Struts2学习之文件上传》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Go Web 编程

Go Web 编程

[新加坡]Sau Sheong Chang(郑兆雄) / 黄健宏 / 人民邮电出版社 / 2017-11-22 / 79

《Go Web 编程》原名《Go Web Programming》,原书由新加坡开发者郑兆雄(Sau Sheong Chang)创作、 Manning 出版社出版,人名邮电出版社引进了该书的中文版权,并将其交由黄健宏进行翻译。 《Go Web 编程》一书围绕一个网络论坛 作为例子,教授读者如何使用请求处理器、多路复用器、模板引擎、存储系统等核心组件去构建一个 Go Web 应用,然后在该应用......一起来看看 《Go Web 编程》 这本书的介绍吧!

在线进制转换器
在线进制转换器

各进制数互转换器

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具