Struts2框架之文件上传

版权声明:本文为博主原创文章,遵循 CC 4.0 BY 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/qq_41855420/article/details/102731123

在之前博客 Java Web 通过JSP上传文件实例,使用了html中内置的file标签<input type="file" name="file" value="浏览文件">进行文件上传。在Struts的内置标签库中,同样也提供了file标签,用户文件上传,称为文件选择域。使用Struts标签库中的file标签,在后端框架会自动进行文件接收,底层细节不用我们关注,这也正是框架的主要作用。

使用Struts标签库中的file文件上传时,表单必须是post方法,并且enctype类型必须为multipart/form-data。并且还需要在前端界面导入struts标签库,在jar包导入
commons-fileupload.jar以及commons-io.jar包。
在这里插入图片描述

1、文件上传实例

①、项目目录结构

在这里插入图片描述

②、UploadFileAction类
package cn.hestyle.web.action;

import com.opensymphony.xwork2.ActionSupport;

import java.io.File;

public class UploadFileAction extends ActionSupport {
    //struts会自动将前端发送的文件转化为一个对象(临时对象)
    private File photo;
    //ContentType、FileName必须与文件名一一对应
    private String photoContentType;
    private String photoFileName;
    //并且需要提供三个属性的setter方法
    public File getPhoto() {
        return photo;
    }

    public void setPhoto(File photo) {
        this.photo = photo;
    }

    public String getPhotoContentType() {
        return photoContentType;
    }

    public void setPhotoContentType(String photoContentType) {
        this.photoContentType = photoContentType;
    }

    public String getPhotoFileName() {
        return photoFileName;
    }

    public void setPhotoFileName(String photoFileName) {
        this.photoFileName = photoFileName;
    }

    public String upload(){
        System.out.println("文件类型:" + photoContentType);
        System.out.println("文件名称:" + photoFileName);
        return "success";
    }
}

如果未添加photoContentTypephotoFileName方法,控制台会报错。
在这里插入图片描述

③、前端jsp界面

uploadFile.jsp文件

<%--
  Created by IntelliJ IDEA.
  User: hestyle
  Date: 2019/10/24
  Time: 8:26 下午
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%-- 使用struts内置标签,必须导入struts标签库 --%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<html>
<head>
    <title>文件上传</title>
</head>
<body>
    <%-- 请求方式必须为post,并且enctype为multipart/form-data类型 --%>
    <s:form action="upload" method="POST" enctype="multipart/form-data">
        <%-- name必须与action处理类字段一一对应 --%>
        <s:file label="照片" name="photo"></s:file>
        <s:submit value="上传"></s:submit>
    </s:form>
</body>
</html>

success.jsp文件

<%--
  Created by IntelliJ IDEA.
  User: hestyle
  Date: 2019/10/24
  Time: 8:26 下午
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>文件上传</title>
</head>
<body>
    文件上传成功!
</body>
</html>

④、struts.xml配置文件
<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE struts PUBLIC
        "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
        "http://struts.apache.org/dtds/struts-2.5.dtd">

<struts>
    <!-- 开启开发模式 -->
    <constant name="struts.devMode" value="true"></constant>

    <package name="p1" extends="struts-default">
        <action name="upload" class="cn.hestyle.web.action.UploadFileAction" method="upload">
            <!-- 如果出现字段错误,返回到uploadFile.jsp界面 -->
            <result name="input">/uploadFile.jsp</result>
            <result name="success">/success.jsp</result>
        </action>
    </package>
</struts>
⑤、浏览器访问

在这里插入图片描述
在这里插入图片描述在这里插入图片描述控制台输出
在这里插入图片描述

2、增加文件类型约束

在上面的文件上传实例中,用户可以上传任意文件类型的文件,但是我们的需求是一张图片,所以我们需要对用户上传的文件进行类型约束。

方式一:添加文件类型限制

在默认拦截器组中添加文件上传允许的文件类型参数。
在这里插入图片描述在这里插入图片描述
在这里插入图片描述

方式二:添加文件扩展名限制

往默认拦截器组中添加文件上传允许的文件扩展名参数

在这里插入图片描述
在这里插入图片描述在这里插入图片描述 \color{red}注意: 两种方法都必须提供input结果视图为上传文件的jsp才能看到报错信息。

3、增加文件大小约束

有些道友可能已经发觉了这个问题,我们还没有对文件大小进行限制,那岂不是客户能上传一张几个G的图片?
但是struts默认情况下设置了2MB以内的限制。
在这里插入图片描述
现在我们将它修改为10KB的大小限制。
在这里插入图片描述在前端界面添加显示文件上传大小超限标签。
在这里插入图片描述
在这里插入图片描述

\color{red}注意 :如果你上传问题提示连接重置

在这里插入图片描述
此问题在用tomcat7/8/9版本会出现,原因是Tomcat7/8/9与struts2的兼容性问题:
当request的最大的字节数(不包括传输编码开销)超过tomcat服务器conf文件server.xml中maxSwallowSize的设置值将会被Tomcat终止上传,tomcat会判定是个失败的上传,不会把这个request再传送到应用的servlet对象,所以不会有应用的servlet对这个request没有任何响应。

但是客户端收不到超过上传限制的response,所以客户端会仍然发送它。所以tomcat会发送一个连接重置给客户端(浏览器)。

这样就会出现文件上传 超过大小限制无法跳转至指定input页面,浏览器提示连接已重置的问题。

解决方法:
在这里插入图片描述
如果server.xml中配置了maxSwallowSize,修改为更大,否则默认是2MB。
或者选择一个不超过2MB但是比我们刚刚配置的struts上传大小限制大的文件。

4、修改为中文提示

可以看出,刚刚的格式错误提示、大小超限提示都是英文,我们可以将它修改为中文提示。
原文提示定义在struts2-core.jar\org.apache.struts2\struts-message.properties
在这里插入图片描述

第一步:在src创建fileupload_message.properties文件。

首先修改IDEA的properties文件默认编码类型, \color{red}必须先修改编码类型再创建文件!
在这里插入图片描述在这里插入图片描述

struts.messages.error.uploading=文件上传错误: {0}
struts.messages.error.content.type.not.allowed=文件类型不被允许: {0} "{1}" {3}
struts.messages.error.file.extension.not.allowed=文件扩展名不被允许: {0} "{1}" {3}
struts.messages.upload.error.SizeLimitExceededException=文件最大大小限制: {0} 上传的文件大小为: {1}!
第二步:修改默认资源文件(注意不写后缀!!!)

在这里插入图片描述

第三步:浏览器测试

在这里插入图片描述

5、修改为多文件上传

修改uploadFile.jsp文件
我这里偷了一下懒,将所有文件标签统一命名,多文件给struts处理。当然你也可以给每个file标签命不同名字,这样在upload类中就定义多个属性。
在这里插入图片描述
修改UploadFileAction类,将photo、photoContentType、photoFileName修改为数组类型,struts会自动接收多文件。

package cn.hestyle.web.action;

import com.opensymphony.xwork2.ActionSupport;

import java.io.File;

public class UploadFileAction extends ActionSupport {
    //struts会自动将前端发送的文件转化为一个对象(临时对象)
    private File[] photo;
    //ContentType、FileName必须与文件名一一对应
    private String[] photoContentType;
    private String[] photoFileName;
    public File[] getPhoto() {
        return photo;
    }

    public void setPhoto(File[] photo) {
        this.photo = photo;
    }

    public String[] getPhotoContentType() {
        return photoContentType;
    }

    public void setPhotoContentType(String[] photoContentType) {
        this.photoContentType = photoContentType;
    }

    public String[] getPhotoFileName() {
        return photoFileName;
    }

    public void setPhotoFileName(String[] photoFileName) {
        this.photoFileName = photoFileName;
    }

    public String upload(){
        int fileCount = photo.length;
        for (int i = 0; i < fileCount; ++i) {
            System.out.println("文件类型:" + photoContentType[i] + "\t文件名称:" + photoFileName[i]);
        }
        return "success";
    }
}

在这里插入图片描述控制台输出
在这里插入图片描述以上只是演示了文件上传,并没有保存文件,文件对象struts都给你弄好了,直接写入磁盘即可。
以上就是Struts2框架之文件上传的主要内容,大家给个关注、点个赞呗,好久没人关注了。。。

猜你喜欢

转载自blog.csdn.net/qq_41855420/article/details/102731123