• sruts2:单个文件上传,多个文件上传(属性驱动)


    文件上传功能在Struts2中得到了很好的封装,主要使用fileUpload上传组件。

    1. 单个文件上传

    1.1 创建上传单个文件的JSP页面、显示提交结果的JSP页面

    uploadTest1.jsp

    <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
    <%@ page isELIgnored="false"%>
    <%@ taglib uri="/struts-tags" prefix="s"%>
    
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
        <head>
        </head>
        <body>
            <s:form action="uploadT1" method="post" enctype="multipart/form-data">
                <s:file name="uploadFile"></s:file>
                <br />
                <s:submit value="提交"></s:submit>
            </s:form>
        </body>
    </html>

    注意:代码中加入了enctype="multipart/form-data";而且使用了<s:file/>标签,尤其注意<s:file/>的name属性。

    showResult1.jsp

    <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
    <%@ page isELIgnored="false"%>
    <%@ taglib uri="/struts-tags" prefix="s"%>
    
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
        <body>
            您上传的文件名为:<s:property value="uploadFileFileName" />,存放目录:<s:property value="#request.storeDir"/>
            <br />
            <br/>
            <!--下载上下文路径-->
            <s:a href="%{#request.get('javax.servlet.forward.context_path')}/upload/%{uploadFileFileName}">点击这里下载</s:a>
            <br />
        </body>
    </html>

    1.2 生成Action类

    package com.clzhang.struts2.demo12;
    
    import java.io.File;
    import java.io.IOException;
    import org.apache.commons.io.FileUtils;
    import org.apache.struts2.ServletActionContext;
    import com.opensymphony.xwork2.ActionSupport;
    
    public class UploadTest1Action extends ActionSupport {
        public static final long serialVersionUID = 1;
    
        private File uploadFile;
        private String uploadFileFileName;
    
        public File getUploadFile() {
            return uploadFile;
        }
        public void setUploadFile(File uploadFile) {
            this.uploadFile = uploadFile;
        }
        public String getUploadFileFileName() {
            return uploadFileFileName;
        }
        public void setUploadFileFileName(String uploadFileFileName) {
            this.uploadFileFileName = uploadFileFileName;
        }
    
        public String execute() throws IOException {
            // 上传物理路径
            String targetDirectory = ServletActionContext.getServletContext().getRealPath("/upload");
            // 生成上传的File对象
            File target = new File(targetDirectory, uploadFileFileName);
            // 复制File对象,从而实现上传文件
            FileUtils.copyFile(uploadFile, target);
            
            ServletActionContext.getRequest().setAttribute("storeDir", targetDirectory);
    
            return SUCCESS;
        }
    }

    Action实例中File变量命名规则

    • 数据类型为File的变量uploadFile和JSP页面中的<s:file/>标签的name属性值要一致,这样才可以使用Struts2的拦截器进行属性值的自动封装。
    • Action实例中有uploadFileFileName变量,对应于上传文件的文件名,它的命名规则就是File的变量名后加FileName。

    1.3 设置上传文件相关参数(struts.properties)

    struts.multipart.maxSize=2048000000
    struts.multipart.saveDir=/upload

    通常此文件存放于WEB-INFclasses目录下。

    1.4 修改struts.xml文件

            <action name="uploadT1" class="com.clzhang.struts2.demo12.UploadTest1Action">
                <result>/struts2/demo12/showResult1.jsp</result>
            </action>

    1.5 测试

    打开IE,输入地址:http://127.0.0.1:8080/st/struts2/demo12/uploadTest1.jsp

    结果如下

    选择任意一个文件提交后,结果如下

    一个,显示了服务器物理存储地址;二个,提供了下载链接。

    2. 多个文件上传(属性驱动)

    Struts2支持多文件批量上传,将上面的代码中的File类型改成File[]即可。

    2.1 创建上传多个文件的JSP页面、显示提交结果的JSP页面

    uploadTest2.jsp

    <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
    <%@ page isELIgnored="false"%>
    <%@ taglib uri="/struts-tags" prefix="s"%>
    
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
        <head>
        </head>
        <body>
            <s:form action="uploadT2" method="post" enctype="multipart/form-data">
                username:<s:textfield name="fileUploadTools.username"></s:textfield>
                <br />
                <s:file name="fileUploadTools.uploadFile"></s:file>
                <br />
                <s:file name="fileUploadTools.uploadFile"></s:file>
                <br />
                <s:file name="fileUploadTools.uploadFile"></s:file>
                <br />
                <s:submit value="提交"></s:submit>
            </s:form>
        </body>
    </html>

    注意:因为是属性驱动,所以表单元素的命名需要以fileUploadTools打头。

    showResult2.jsp

    <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
    <%@ page isELIgnored="false"%>
    <%@ taglib uri="/struts-tags" prefix="s"%>
    
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
        <body>
            您上传的文件名列表:
            <br/>
            <!--对Action中对象(fileUploadTools)包含的数组(uploadFileFileName)的遍历-->
            <s:iterator value="fileUploadTools.uploadFileFileName" status="st">
                <s:iterator value="fileUploadTools.uploadFileFileName[#st.index]"> 
                    <s:property />
                    <br/>
                </s:iterator>
            </s:iterator>
            <br />
        </body>
    </html>

    2.2 生成Action类及属性驱动类

    UploadTest2Action.java

    package com.clzhang.struts2.demo12;
    
    import java.io.IOException;
    
    import com.opensymphony.xwork2.ActionSupport;
    
    public class UploadTest2Action extends ActionSupport {
        public static final long serialVersionUID = 1;
    
        // 声明封装了File上传的FileUploadTools类的实例
        // FileUploadTools类也封装了上传的属性及get和set方法
        private FileUploadTools fileUploadTools = new FileUploadTools();
    
        public FileUploadTools getFileUploadTools() {
            return fileUploadTools;
        }
        public void setFileUploadTools(FileUploadTools fileUploadTools) {
            this.fileUploadTools = fileUploadTools;
        }
    
        @Override
        public String execute() throws IOException {
            fileUploadTools.beginUpload();
            
            return SUCCESS;
        }
    }

    FileUploadTools.java

    package com.clzhang.struts2.demo12;
    
    import java.io.File;
    import java.io.IOException;
    import java.text.SimpleDateFormat;
    import java.util.Date;
    
    import org.apache.commons.io.FileUtils;
    import org.apache.struts2.ServletActionContext;
    
    public class FileUploadTools {
        private String username;
        private File uploadFile[];// 上传的文件是数组类型
        private String uploadFileFileName[];// 文件名是数组类型
        private String uploadFileContentType[];
    
        public String getUsername() {
            return username;
        }
        public void setUsername(String username) {
            this.username = username;
        }
        // 上传的ContentType文件类型也是数组类型
        // 必须要加上对ContentType的声明,否则会出现异常
        public String[] getUploadFileContentType() {
            return uploadFileContentType;
        }
        public void setUploadFileContentType(String[] uploadFileContentType) {
            this.uploadFileContentType = uploadFileContentType;
        }
        public File[] getUploadFile() {
            return uploadFile;
        }
        public void setUploadFile(File[] uploadFile) {
            this.uploadFile = uploadFile;
        }
        public String[] getUploadFileFileName() {
            return uploadFileFileName;
        }
        public void setUploadFileFileName(String[] uploadFileFileName) {
            this.uploadFileFileName = uploadFileFileName;
        }
    
        public String beginUpload() throws IOException {
            System.out.println("用户名:" + username);
    
            String targetDirectory = ServletActionContext.getServletContext().getRealPath("/upload");
            for (int i = 0; i < uploadFile.length; i++) {
                File target = new File(targetDirectory, new SimpleDateFormat("yyyy_MM_dd_HH_mm_ss")
                        .format(new Date()).toString() + System.nanoTime() + uploadFileFileName[i]);
    
                FileUtils.copyFile(uploadFile[i], target);
            }
    
            return "success";
        }
    }

    2.3  设置上传文件相关参数(struts.properties),同上

    2.4 修改struts.xml文件

            <action name="uploadT2" class="com.clzhang.struts2.demo12.UploadTest2Action">
                <result>/struts2/demo12/showResult2.jsp</result>
            </action>

    2.5 测试

    打开IE,输入地址:http://127.0.0.1:8080/st/struts2/demo12/uploadTest2.jsp

    结果如下:

    任意选择三个文件后,提交,结果如下:

  • 相关阅读:
    连Action Bar都不会 你能说你学过 Android?
    Java设计模式 —— 单例模式
    删库跑路 + 比特币勒索?我的MySQL被黑客攻破了
    微信小程序 带参二维码 纯Java实现
    【个人简介】关于博主&阅读指南
    微信小程序 获取 手机验证码 短信验证码 后端功能实现解析
    Handler processing failed; nested exception is java.lang.NoSuchMethodError:
    腾讯云服务器备案全流程 40天备案的血与泪
    [总结]2020年2月 OI学习/刷题记录
    [Luogu P5680][GZOI2017]共享单车
  • 原文地址:https://www.cnblogs.com/nayitian/p/3504256.html
Copyright © 2020-2023  润新知