美文网首页Java
Struts2文件上传和下载

Struts2文件上传和下载

作者: 达摩君 | 来源:发表于2017-12-29 14:27 被阅读5次

1.文件上传

必要前提:
a.表单method必须是post;
b.enctype取值必须是multipart/form-data;
c.提供文件选择域。

<body>
    <s:actionerror></s:actionerror>
    <s:form action="upload.action" method="POST" enctype="multipart/form-data">
        <s:textfield name="username" label="用户名"></s:textfield>
        <s:file name="photo" label="照片"/>
        <s:submit value="上传"/>
    </s:form>
</body>

动作类:

public class UploadAction extends ActionSupport {

    //表单上提供的字段
    private String username;
    private File photo;
    //Struts2在文件上传时提供的属性
    private String photoFileName;//上传的文件名。上传字段名称+FileName
    private String photoContentType; //上传文件的MINE类型。上传字段名称+contentType

    public String upload() throws Exception {
        //创建目录
        ServletContext application = ServletActionContext.getServletContext();
        String filePath = application.getRealPath("/WEB-INF/files");
        File file = new File(filePath);
        if (!file.exists()){
            file.mkdirs();
        }
        //存photo
        //拷贝:把photo的临时文件复制到指定位置,但是临时文件还在
//        FileUtils.copyFile(photo, new File(file,photoFileName));
        //剪切:吧临时文件剪切到指定位置,临时文件没有啦
        photo.renameTo(new File(file, photoFileName));

        return null;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public File getPhoto() {
        return photo;
    }

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

    public String getPhotoFileName() {
        return photoFileName;
    }

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

    public String getPhotoContentType() {
        return photoContentType;
    }

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

2、文件上传的配置

2.1、文件上传大小限制(默认是2MB)
<constant name="struts.devMode" value="true"> </constant>
    <!--第一种:struts.multipart.maxSize=2097152 默认最大2mb-->
    <!--<constant name="struts.multipart.maxSize" value="5242880"></constant>-->

    <package name="ppp" extends="struts-default">
        <action name="upload" class="com.ljb.web.UploadAction" method="upload">
            <!--第二种:通过fileUpload的拦截器注入参数,控制文件大小-->
            <interceptor-ref name="defaultStack">
                <param name="fileUpload.maximumSize">
                    5242880
                </param>
            </interceptor-ref>
            <result>/success.jsp</result>
            <result name="input">/upload.jsp</result>
        </action>
    </package>
2.2、限制文件上传的类型
<package name="ppp" extends="struts-default">
        <action name="upload" class="com.ljb.web.UploadAction" method="upload">
            <!--第二种:通过fileUpload的拦截器注入参数,控制文件大小-->
            <interceptor-ref name="defaultStack">
                <param name="fileUpload.maximumSize">
                    5242880
                </param>
                <!--a、通过限制上传文件的扩展名,多个用逗号分隔-->
                <param name="fileUpload.allowedExtensions">
                    jpg,png,bmp
                </param>
                <!--b、通过限制上传文件的MIME类型-->
                <param name="fileUpload.allowedTypes">
                    image/bmp,image/pjpeg,image/jpg
                </param>
            </interceptor-ref>
            <result>/success.jsp</result>
            <result name="input">/upload.jsp</result>
        </action>
    </package>

3.出错后的错误信息中文提示(Struts2中的所有文本提示都是基于国际化的)

image.png

解决办法:用国际化消息资源包,把对应的key取值改为中文即可

<constant name="struts.custom.i18n.resources" value="filepload_message"></constant>
struts.messages.error.content.type.not.allowed=上传文件类型不匹配: {0} "{1}" "{2}" {3}

4.文件下载:其实就是一种结果类型(Stream)

public class DownloadAction extends ActionSupport {
    //注意:在给inputstream指定名字时,不能使用in!!!
    public InputStream inputStream;

    private String fileName;

    public String download() throws Exception {
        //找到文件路径
        String path = ServletActionContext.getServletContext().getRealPath("/WEB-INF/files/时机.png");

        inputStream = new FileInputStream(path);

        fileName = "照片.jpg";
        //如果有中文,需要urlencoder进行编码
        fileName = URLEncoder.encode(fileName,"UTF-8");
        return "success";
        //剩下的交给stream类型的结果去完成
    }

    public InputStream getInputStream() {
        return inputStream;
    }

    public void setInputStream(InputStream inputStream) {
        this.inputStream = inputStream;
    }

    public String getFileName() {
        return fileName;
    }

    public void setFileName(String fileName) {
        this.fileName = fileName;
    }
}

配置文件

<action name="download" class="com.ljb.web.DownloadAction" method="download">
            <result name="success" type="stream">
                <!--inputName属性:配置输入流。其实就是把动作类的输入流字段名写进来-->
                <param name="inputName">inputStream</param>
                <!--contentDisposition:设置响应消息头,告知浏览器以下载的方式打开
                使用ognl表达式动态获取文件名-->
                <param name="contentDisposition">attachment;filename=${fileName}</param>
                <!--contentType:设置响应消息头,告知浏览器,响应正文的MIME类型-->
                <param name="contentType">application/octet-stream</param>
            </result>
        </action>

OGNL简介

1、什么是OGNL

OGNL是Object Graphic Navigation Language(对象图导航语言)的缩写,它是一个单独的开源项目。 Struts2框架使用OGNL作为默认的表达式语言。

2、OGNL的功能

前提:OGNL是struts2整合的一个开源项目,所以在struts2中,要想使用OGNL表达式,必须使用Struts2标签库

2.1、支持普通方法的调用
<%@ taglib prefix="s" uri="/struts-tags" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>ognl</title>
</head>
<body>
    <s:property value="OGNL-Expresion"></s:property>这是一个OGNL表达式<br>
    <s:property value="'OGNL-Expresion'"></s:property>这是一个普通的字符串<br>
    <s:property value="'OGNL-Expresion'.length()"></s:property>使用普通字符串调用获取长度方法<br>

2.2、访问静态成员(静态属性,静态方法)

(EL表达式只能调用静态方法)

<%--访问静态属性的方式:@全类名@静态名--%>
    <s:property value="@java.lang.Integer@MAX_VALUE"></s:property><br>
    <%--访问静态方法,在struts2中,ognl默认禁用访问静态方法。--%>
    <%--struts.ognl.allowStaticMethodAccess=false--%>
    <%--我们通过在struts.xml中启用--%>
    <s:property value="@java.lang.Math@random()"></s:property><br>
<constant name="struts.ognl.allowStaticMethodAccess" value="true"></constant>
2.3、操作集合对象
<%--创建list对象--%>
    <s:radio  name="gender" list="{'男','女'}"></s:radio><br>
    <%--创建map对象 1,0是value --%>
    <s:radio name="gender1" list="#{'1':'男','0':'女'}"></s:radio>

相关文章

  • Struts下

    Struts2 第三天 学习目标 在struts2框架下怎么实现文件的上传下载 在struts2框架中怎么使用js...

  • Struts框架基本用法-文件上传和文件下载

    文件上传和文件下载前的准备工作 第一步 下载struts2框架,我这里下载的是2.3.33版本下载完后还需要安装3...

  • 11、Struts2 的文件上传和下载

    文件上传 表单准备要想使用 HTML 表单上传一个或多个文件须把 HTML 表单的 enctype 属性设置为 m...

  • Struts2文件上传和下载

    1.文件上传 必要前提:a.表单method必须是post;b.enctype取值必须是multipart/for...

  • 文件上传与下载(四)Struts2 实现

    这一部分使用Struts2实现文件的上传与下载。 必须条件:前台form表单 method="post" enct...

  • java文件下载上传

    文件上传 App图片上传 html文件上传 文件下载 文件下载 版本控制 xml版本控制

  • 文件上传

    Struts2框架默认采用Commons-fileupload组件完成文件上传功能。 • 使用Struts2框架实...

  • SSH上传下载命令

    上传文件 下载文件 上传目录 下载目录

  • 文件上传和下载

    一.项目用到的图片上传的关键方法:直接使用android-async-http.jar 二、文件下载 1.普通单线...

  • 文件上传和下载

    iview的upload组件中上传前添加提示信息,确认后再进行上传https://blog.csdn.net/we...

网友评论

    本文标题:Struts2文件上传和下载

    本文链接:https://www.haomeiwen.com/subject/xpudgxtx.html