【Struts2】【文件的上传和下载】【fileUpload拦截器】

文件上传

1.jsp的设置
  • enctype=”multipart/form-data” 上传必备
  • method=”post”
  • 使用<s: file name="XX"/>
<s:form action="/Upload" method="post" enctype="multipart/form-data" theme="simple">
    选择图片:<s:file name="myPicture" /><br/>
<s:submit value="do it"/>
</s:form>
2.Action的设置

1.接收三个参数

    private File myPicture;//文件对象
    private String myPictureFileName;//用户传入文件名   如XXX.png
    private String myPictureContentType;//文件的MIME类型  如image/png

    //三个参数的setter方法
    public void setMyPicture(File myPicture) {
        this.myPicture = myPicture;
    }
    public void setMyPictureFileName(String myPictureFileName) {
        this.myPictureFileName = myPictureFileName;
    }
    public void setMyPictureContentType(String myPictureContentType) {
        this.myPictureContentType = myPictureContentType;
    }

2.处理上传文件
- 获得webapp下的路径ServletActionContext.getServletContext().getRealPath(“/WEB_INF/upload”);
- 获得新的文件对象 new File(路径,文件名)
- 文件拷贝

public class UploadAction extends ActionSupport implements Validateable{


    public void validateExecute() {
        if(myPicture==null) {
            super.addFieldError("file","请选择上传文件");
        }
    }
    @InputConfig(resultName="login")
    public String execute() throws Exception {
        //获取文件存储的路径
        ServletContext app = ServletActionContext.getServletContext();
        String path = app.getRealPath("/WEB-INF/upload");
        System.out.println(path);
        //保存上传文件
        File file = new  File(path,myPictureFileName);
        FileUtils.copyFile(myPicture, file);
        return "login";
    }
}   
3.配置文件的设置

常量配置

struts.multipart.parser=jakarta    //上传文件的组件
struts.multipart.saveDir=XX        //临池文件的目标 (不改)
struts.multipart.maxSize=2097152   //一次请求所有文件的大小不超2M

fileUpload拦截器

  • 设置单个文件的大小
  • 设置上传文件的类型
  • 因为上传的Action类很少,所以拦截器直接声明在<action>
<action name="Upload_*" class="action.UploadAction" method="{1}">
            <!--声明上传拦截器-->
             <interceptor-ref name="fileUpload">
                    <param name="allowedExtensions">png,gif</param>
                    <param name="maximumSize">102400</param>
             </interceptor-ref>
            <!--声明上传默认拦截器-->
             <interceptor-ref name="defaultStack"/>
</action>

情况1;上传文件不符合大小时:
这里写图片描述
情况2:上传文件不符合类型时;
这里写图片描述

4.错误信息的国际化

如何使得文件过大,文件不符合类型转为中文信息?

  1. 英文信息来源
    这里写图片描述

  2. 数值的含义

    • {0}:文件对象的名,即<s:file>的name属性
    • {1}:用户上传的文件本地名称
    • {2}:在临时目录中的名称
    • {3}:文件的mime类型
    • {4}:拦截器中,文件的最大值
    • -
  3. 修改成中文

添加uploadMessage.properties文件

struts.messages.error.file.too.large=文件{1}过大,请不要超过{4}
struts.messages.error.file.extension.not.allowed=文件类型为{3},不符合要求

引入到struts.xml文件中

    <constant name="struts.custom.i18n.resources" value="uploadMessage"/>

修改后的结果为
这里写图片描述
这里写图片描述

文件下载

jsp的设置

fileName的作用:
- 在Action类中,配合路径定位到文件
- 在Struts.xml文件中,设为用户下载文件的默认名

<s:a action="/Download?fileName=文件名">文件名</s:a>
<s:a action="/Download?fileName=LWF.png">LWF.png</s:a>
Action类的设置
  • 接收请求的参数fileName
    • setter:用于请求时候注入参数
    • getter:用于给用户下载文件时候,提供默认文件名
    private String fileName;
    //用于接收请求来的参数
    public void setFileName(String fileName) {
        this.fileName = fileName;
    }
    //用于struts.xml中输出参数
    public String getFileName() {
        return fileName;
    }
public class DownloadAction extends ActionSupport{

    //用于返回文件的方法 ,getXXX
    public InputStream getInputStream() throws Exception {
        //获得文件所在目录
        ServletContext app = ServletActionContext.getServletContext();
        String path = app.getRealPath("/WEB-INF/download");
        //生成文件对象
        File file=new File(path,fileName);
        return new FileInputStream(file);
    }
}
//增强:可以用包装的读取流来提速
return new BufferedInputStream(new FileInputStream(file));
struts.xml的设置
  • 下载的逻辑视图类型为”stream”
  • 设置参数
    • inputName=输出流的方法名称
    • contentDisposition=attachment;filename=”用户下载文件时候的默认名”
      //用${fileName}从Root中取(因为有getter方法)
            <action name="Download_*" class="action.DownloadAction" method="{1}">
                <result type="stream">
                    <param name="inputName">inputStream</param><!--是默认值,也对应这方法getInputStream-->
                    <param name="contentDisposition">attachment;filename="hahah"</param>
                </result>   
            </action>
执行流程
1.访问Action后,返回逻辑视图为success,type为"stream";(默认访问execute方法返回success)
2.根据参数inputName,从Action中获得文件的输出流,
3.根据contentDisposition,给被下载的文件赋予初始名
4.响应给用户
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值