struts文件上传下载

来源:互联网 发布:windows 开发周期 编辑:程序博客网 时间:2024/05/31 19:04
struts的文件上传拦截器帮助我们完成了文件上传的功能:
<interceptor name="fileUpload" class="org.apache.struts2.interceptor.FileUploadInterceptor"/>

文件上传Demo

upload.jsp:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html>  <head>    <base href="<%=basePath%>">    <title>My JSP 'index.jsp' starting page</title>    <meta http-equiv="pragma" content="no-cache">    <meta http-equiv="cache-control" content="no-cache">    <meta http-equiv="expires" content="0">        <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">    <meta http-equiv="description" content="This is my page">    <!--    <link rel="stylesheet" type="text/css" href="styles.css">    -->  </head>  <body>    <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>  </body></html>

Action:

public class FileUpload extends ActionSupport {    // 对应表单:<input type="file" name="file1">    private File file1;     // 文件名    private String file1FileName;    // 文件的类型(MIME)    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目录        // 获取上传的目录路径        String path = ServletActionContext.getServletContext().getRealPath("/upload");        // 创建目标文件对象        File destFile = new File(path,file1FileName);        // 把上传的文件,拷贝到目标文件中        FileUtils.copyFile(file1, destFile);        return SUCCESS;    }}

文件上传细节

文件大小限制

struts2默认支持的文件上传最大是2M。我们可以通过在配置文件(.xml)中修改常量改变:
<!-- 修改上传文件的最大大小为30M --><constant name="struts.multipart.maxSize" value="31457280"/>

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

需求: 只允许txt/jpg后缀的文件方法: 向拦截器注入参数从而限制文件的上传类型
<struts>    <package name="upload_" extends="struts-default">        <!-- 注意: action 的名称不能用关键字"fileUpload" -->        <action name="fileUploadAction" class="cn.itcast.e_fileupload.FileUpload">            <!-- 限制运行上传的文件的类型 -->            <interceptor-ref name="defaultStack">                               <!-- 限制运行的文件的扩展名 -->                <param name="fileUpload.allowedExtensions">txt,jpg,jar</param>                <!-- 限制运行的类型   【与上面同时使用,取交集】                <param name="fileUpload.allowedTypes">text/plain</param>                -->                         </interceptor-ref>            <result name="success">/e/success.jsp</result>        </action>    </package>  </struts>

错误提示

当文件上传出现错误的时候,struts内部会返回input视图(错误视图)。所以就需要我们在struts.xml中配置input视图对应的错误页面!
<struts>    <package name="upload_" extends="struts-default">        <!-- 注意: action 的名称不能用关键字"fileUpload" -->        <action name="fileUploadAction" class="cn.itcast.e_fileupload.FileUpload">            <!-- 配置错误视图 -->            <result name="input">/e/error.jsp</result>        </action>    </package>  </struts>
<body>    error.jsp<br/>    <!-- 查看struts框架在运行时期产生的所有错误信息 -->    <%@ taglib uri="/struts-tags" prefix="s" %>    <s:fielderror></s:fielderror>  </body>

文件下载

文件下载的两种方式:    方式1: 通过response对象向浏览器写入字节流数据;设置下载的响应头    方式2: struts的方式

list.jsp:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html>  <head>    <base href="<%=basePath%>">    <title>下载列表</title>    <meta http-equiv="pragma" content="no-cache">    <meta http-equiv="cache-control" content="no-cache">    <meta http-equiv="expires" content="0">      </head>  <body>    <table border="1" align="center">        <tr>            <td>编号</td>            <td>文件名</td>            <td>操作</td>        </tr>        <%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>        <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:

/** * 文件下载 * 1. 显示所有要下载文件的列表 * 2. 文件下载 */public class DownAction extends ActionSupport {    /*************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) {            throw new RuntimeException(e);        }        // 把处理好的文件名,赋值        this.fileName = fileName;    }    //2. 下载提交的业务方法 (在struts.xml中配置返回stream)    public String down() throws Exception {        return "download";    }    // 3. 返回文件流的方法    public InputStream getAttrInputStream(){        return ServletActionContext.getServletContext().getResourceAsStream("/upload/" + fileName);    }    // 4. 下载显示的文件名(浏览器显示的文件名)    public String getDownFileName() {        // 需要进行中文编码        try {            fileName = URLEncoder.encode(fileName, "UTF-8");        } catch (UnsupportedEncodingException e) {            throw new RuntimeException(e);        }        return fileName;    }   }

xml配置:

<action name="down_*" class="cn.itcast.e_fileupload.DownAction" method="{1}">    <!-- 列表展示 -->    <result name="list">/e/list.jsp</result>    <!-- 下载操作 -->    <result name="download" type="stream">        <!-- 运行下载的文件的类型:指定为所有的二进制文件类型 -->       <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>

这里写图片描述

0 0