zoukankan      html  css  js  c++  java
  • Struts的文件上传下载

    Struts的文件上传下载

    1.文件上传

    Struts2的文件上传也是使用fileUpload的组件,这个组默认是集合在框架里面的。且是使用拦截器:<interceptor name="fileUpload" calss="org.apache.struts2.interceptor.FileUploadInterceptor/> 来完成的。

    1.1.Struts完成文件上传的基本步骤

    由于功能已经在拦截器就已经完成了,所以在action中就只需要进行配置就可以了,需要注意的是:在action的代码中File要和jsp表单中的name一致
    jsp中的上传代码是:

    <form action="${pageContext.request.contextPath}/fileUploadAction" method="post" enctype="multipart/form-data">
        用户名:<input type="text" name="userName"><br/>
        文件:<input type="file" name="file1"><br/>
        <input type="submit" value="上传">
    </form>
    

    action的处理程序,其实处理程序就是一个配置,因为写法是固定的:

    package e_fileUpload;
    
    import com.opensymphony.xwork2.ActionSupport;
    import org.apache.commons.io.FileUtils;
    import org.apache.struts2.ServletActionContext;
    
    import java.io.File;
    
    /**
     * Struts实现上传并保存
     */
    public class FileUpload extends ActionSupport{
        //对应input表单的name
        private File file1;
        //文件名
        private String file1FileName;
        //文件的类型
        private String file1ContentType;
    
        public void setFile1(File file1) {
            this.file1 = file1;
        }
    
        public void setFile1FileName(String file1FileName) {
            this.file1FileName = file1FileName;
        }
    
        public void setFile1ContentType(String file1ContentType) {
            this.file1ContentType = file1ContentType;
        }
    
    
    
        @Override
        public String execute() throws Exception {
            /*****拿到上传的文件,进行处理****/
            //一、把文件上传到upload目录
            //1.获取上传的目录路径
            String path = ServletActionContext.getServletContext().getRealPath("/upload");
            //2.创建目录文件对象
            File destFile = new File(path, file1FileName);
            //3.把上传的文件,拷贝到目标文件中
            FileUtils.copyFile(file1,destFile);
            return SUCCESS;
        }
    }
    
    

    配置文件xml

        <package name="upload_" extends="struts-default" namespace="/">
            <!--action的名称不能使用关键字“fileUpload"-->
            <action name="fileUploadAction" class="e_fileUpload.FileUpload" >
                <result name="success">/e/success.jsp</result>
    
            </action>
        </package>
    

    1.2.上传文件大小限制

    Struts默认的上传文文件最大是2MB,如果需要修改,则需要在全局配置中修改常量maxSize:

        <!--修改文件上传最大为30M,只需要修改这个常量的值为30M-->
        <constant name="struts.multipart.maxSize" value="31457280"/>
    

    1.2.限制上传文件允许的类型

    例如:只允许txt/jpg后缀的文件上传
    思路:是拦截器中注入参数从而限制文件上传类型
    方法是通过配置解决:

        <package name="upload_" extends="struts-default" namespace="/">
            <!--action的名称不能使用关键字“fileUpload"-->
            <action name="fileUploadAction" class="e_fileUpload.FileUpload" >
                <!--限制运行上传的文件的类型,可以使用下面的两个方法都行,不可同时使用-->
                <interceptor-ref name="defaultStack">
                    <!--1.限制运行的文件的扩展名,name是固定写法,txt,jpg可以自己填写 -->
                    <param name="fileUpload.allowedExtensions">txt,jpg</param>
                    <!--2.限制允许的类型,如果根上面同时用,回去两者的交集-->
                    <param name="fileUpload.allowedTypes">text/plain</param>
                </interceptor-ref>
                <result name="success">/e/success.jsp</result>
                <!--配置错误视图-->
                <result name="input">/e/error.jsp</result>
            </action>
        </package>
    

    1.3.input错误提示

    当文件上传出错误时候,Struts内部会返回input视图(错误视图),所以就需要我们在struts.xml配置input视图来转向错误页面
    具体的配置方法只需要在配置中增加一个,例如:

            <action name="fileUploadAction" class="e_fileUpload.FileUpload" >
                <result name="success">/e/success.jsp</result>
                <!--配置错误视图-->
                <result name="input">/e/error.jsp</result>
            </action>
    

    在错误页面error.jsp中,如果向要显示错误信息,可以按照下面的方式显示,这是使用标签的方法:

    
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>error</title>
    </head>
    <body>
    error页面<br/>
    <%--查看struts框架在运行时期产生的所有错误信息--%>
    <%@taglib prefix="s" uri="/struts-tags" %>
    <s:fielderror></s:fielderror>
    </body>
    </html>
    
    

    2.Struts中的文件下载

    在Struts中文件下载有两种方式。

    2.1.普通方式

    通过response对象向浏览器写入字节流数据。设置下载的响应头

    2.2.方式2:Struts方式

    Struts的需要在Struts.xml的配置文件配置参数,但是下载和上传一样,都是程序化的代码,下次用的时候直接copy就可以了。
    效果图如下:

    代码实现如下:
    首先是jsp页面的下载列表页面:

    <%--
      Created by IntelliJ IDEA.
      User: cenyu
      Date: 16-12-25
      Time: 下午3:34
      To change this template use File | Settings | File Templates.
    --%>
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>list</title>
    </head>
    <body>
    <table border="1" align="center">
        <tr>
            <td>编号</td>
            <td>文件名</td>
            <td>操作</td>
        </tr>
        <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
        <c:forEach var="fileName" items="${fileNames}" varStatus="vs">
            <tr>
                <td>${vs.count}</td>
                <td>${fileName}</td>
                <td>
                    <%--构建一个url--%>
                    <c:url var="url" value="down_down">
                        <c:param name="fileName" value="${fileName}"></c:param>
                    </c:url>
                    <a href="${url}">下载</a>
                </td>
            </tr>
        </c:forEach>
    </table>
    </body>
    </html>
    
    

    action的处理类,提供列表展示和下载两种方法,考虑到中文名,都做了中文编码处理:

    package e_fileUpload;
    
    import com.opensymphony.xwork2.ActionContext;
    import org.apache.struts2.ServletActionContext;
    
    import java.io.File;
    import java.io.InputStream;
    import java.io.UnsupportedEncodingException;
    import java.net.URLEncoder;
    import java.util.Map;
    
    /**
     *文件下载:
     * 1.显示所有要下载文件的列表
     * 2.文件下载
     */
    public class DownAction {
        /*********1.显示所有要下载的文件列表************/
        public String list() throws Exception{
            //得到upload目录的路径
            String path = ServletActionContext.getServletContext().getRealPath("/upload");
            //目录对象
            File file = new File(path);
            //得到所有要下载的文件的文集名
            String[] fileNames = file.list();
            //保存
            ActionContext ac = ActionContext.getContext();
            //得到代表request的map(第二种方式)
            Map<String,Object> request = (Map<String, Object>) ac.get("request");
            request.put("fileNames",fileNames);
            return "list";
        }
    
    
        /****************2.文件下载*********************/
        //1.获取要下载的文件的文件名
        private String fileName;
    
        public void setFileName(String fileName) {
            //处理传入的参数的中文问题(get提交)
            try {
                fileName = new String(fileName.getBytes("ISO8859-1"),"UTF-8");
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
                throw new RuntimeException(e);
            }
            //把处理好的文件名,赋值
            this.fileName = fileName;
        }
    
        //2.下载提交的业务方法(在Struts.xml中配置返回stream),此处不用写代码
        public String down() throws Exception{
            return "download";
        }
    
    
        //3.返回文件流的方法
        public InputStream getAttrInputStream(){
            InputStream stream = ServletActionContext.getServletContext().getResourceAsStream("/upload/" + fileName);
            if (stream==null){
                System.out.println("getAttrInputStream()返回null");
            }
            return stream ;
        }
    
        //4.下载显示的文件名(浏览器显示的文件名)
        public String getDownFileName(){
            //需要进行中文编码
            try {
                fileName = URLEncoder.encode(fileName,"UTF-8");
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
                throw new RuntimeException(e);
            }
    
            return fileName;
        }
    }
    
    

    然后要注意的是在下载处理中的xml配置

    <action name="down_*" class="e_fileUpload.DownAction" method="{1}">
                <!--列表展示-->
                <result name="list">/e/list.jsp</result>
                <!--下载操作-->
                <result name="download" type="stream">
                    <!--调用action返回流的方法-->
                        <!--允许下载的文件类型,现指定为所有的二进制文件类型-->
                    <param name="contentType">application/octet-stream</param>
                        <!--对应的是action中属性,返回流的属性,其实就是:getAttrInputStream()-->
                    <param name="inputName">attrInputStream</param>
                        <!--下载头,包括:浏览器显示的文件名-->
                    <param name="contentDisposition">attachment;filename=${downFileName}</param>
                        <!--缓冲区大小设置-->
                    <param name="bufferSize">1024</param>
                </result>
            </action>
    
  • 相关阅读:
    May 9, 17:3020:00, 1479, "Concentrationcompactness/Rigidity method" lecture 4 by Yang Lan
    May 21, 10:0011:00, 1303, "Capacity, Primeter and ADMmass " by Jie Xiao
    课程期末安排
    问题: Schrodinger方程的广义Strichartz估计
    May 21, 11:1012:10 "On small solutions for nonlinear wave equations in exterior domains " by Makoto NAKAMURA
    SQL Server2019数据库备份与还原脚本,数据库可批量备份
    记一次 IIS 站点配置文件备份和还原,物理路径文件批量备份
    从网上收集的一些图片方面的操作
    android获取本地IP
    java利用httpconnect向服务器发送信息与接收回馈信息
  • 原文地址:https://www.cnblogs.com/cenyu/p/6219865.html
Copyright © 2011-2022 走看看