struts2文件上传下载

文件上传

文件上传的前提:

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

引入struts2的标签

<%@ taglib uri="/struts-tags" prefix="s" %>
  <body>
    <%--文件上传的必要前提:
         1.请求方式必须是post
         2.enctype属性的取值必须是multipart/form-data
         3.提供一个文件选择域
    --%>
    <s:actionerror/>
    <s:form action="upload.action" enctype="multipart/form-data">
        <s:textfield name="username" label="用户名" />
        <s:file name="photo" label="照片" />
        <s:submit value="上传"/>
    </s:form>
  </body>

动作类:

//表单上提供的字段
    private String username;
    private File photo;
    //struts2在文件上传时提供的属性
    private String photoFileName;//上传的文件名。上传字段名称+FileName  注意大小写
    private String photoContentType;//上传文件的MIME类型。上传字段名称+ContentType 注意大小写


    public String upload(){
        //1.拿到ServletContext
        ServletContext application = ServletActionContext.getServletContext();
        //2.调用realPath方法,获取根据一个虚拟目录得到的真实目录
        String filePath = application.getRealPath("/WEB-INF/files");
        //3.如果这个真实的目录不存在,需要创建
        File file = new File(filePath);
        if(!file.exists()){
            file.mkdirs();
        }
        //4.把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;
    }

文件上传的配置:
一,文件上传大小限制(默认是2MB)如果上传文件超过了默认大小,upload拦截器会转向一个input的逻辑视图。所有需要配置input视图:

<result name="input">/upload1.jsp</result>

修改文件上传大小的限制:
方法1:

<!-- 限制上传文件的大小,第一种方式:通过修改struts2的常量。
        在default.properties中配的struts.multipart.maxSize=2097152-->
        <constant name="struts.multipart.maxSize" value="5242880"></constant>

方式2:使用的拦截器是fileUploadInterceptor,所以可以向其中注入文件限制大小的方式:

<param name="fileUpload.maximumSize">31457280</param>

二:限制文件上传的类型

1、通过限制上传文件的扩展名:给fileUpload拦截器注入参数

<param name="fileUpload.allowedExtensions">jpg,png,bmp</param>

2、通过限制上传文件的MIME类型

<param name="fileUpload.allowedTypes">image/bmp,image/png,image/gif,image/jpeg,image/jpg,image/x-png, image/pjpeg</param>

注意:这里所有的上传的大小,以及类型如果超出了限制则会跳转到input视图,所有会出现如下的提示:

这里写图片描述

我们需要在出错后的错误信息中文提示(Struts2中的所有文本提示都是基于国际化的)默认信息提示在:struts2-core.jar\org.apache.struts2\struts-message.properties
解决办法:使用国际化消息资源包把对应的key取值改变一下
这里写图片描述
创建一个资源文件:fileuploadmessage.properties,放到src下面
然后配置如下:

<constant name="struts.custom.i18n.resources" value="com.itheima.web.action.fileupload_message"></constant>

多文件上传原理一样:

  <body>
    <%--文件上传的必要前提:
         1.请求方式必须是post
         2.enctype属性的取值必须是multipart/form-data
         3.提供一个文件选择域
    --%>
    <s:actionerror/>
    <s:form action="upload1.action" enctype="multipart/form-data">
        <s:textfield name="username" label="用户名" />
        <s:file name="photo" label="照片" />
        <s:file name="photo" label="照片" />
        <s:submit value="上传"/>
    </s:form>
  </body>

动作类:

public class UploadAction1 extends ActionSupport {

    //表单上提供的字段
    private String username;
    private File[] photo;
    //struts2在文件上传时提供的属性
    private String[] photoFileName;//上传的文件名。上传字段名称+FileName  注意大小写
    private String[] photoContentType;//上传文件的MIME类型。上传字段名称+ContentType 注意大小写


    public String upload(){
        //1.拿到ServletContext
        ServletContext application = ServletActionContext.getServletContext();
        //2.调用realPath方法,获取根据一个虚拟目录得到的真实目录
        String filePath = application.getRealPath("/WEB-INF/files");
        //3.如果这个真实的目录不存在,需要创建
        File file = new File(filePath);
        if(!file.exists()){
            file.mkdirs();
        }
        //4.把photo存过去
        //剪切:把临时文件剪切指定的位置,并且给他重命名。 注意:临时文件没有了
        for(int i=0;i<photo.length;i++){
            photo[i].renameTo(new File(file,photoFileName[i]));
        }

        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;
    }

}

配置文件:和单文件一样


文件下载:

动作类:

public class DownloadAction extends ActionSupport {
    private InputStream inputStream;
    private String filename;

    public String getFilename() {
        return filename;
    }
    public void setFilename(String filename) {
        this.filename = filename;
    }
    public String download() throws Exception{
        String filePath = ServletActionContext.getServletContext().getRealPath("WEB-INF/files/5.jpg");
        inputStream = new FileInputStream(filePath);
        filename = "你好.jpg";
        return SUCCESS;
    }
    public InputStream getInputStream() {
        return inputStream;
    }
    public void setInputStream(InputStream inputStream) {
        this.inputStream = inputStream;
    }
}

配置文件:
注意这里使用了ognl,而且使用了静态方法调用。所有需要声明:

<!-- 开启静态方法调用 -->
<constant name="struts.ognl.allowStaticMethodAccess" value="true"></constant>
<action name="download" class="com.zeroyoung.web.action.DownloadAction" method="download">
      <result name="success" type="stream">
      <param name="contentType">application/octet-stream/</param>
       <param name="contentDisposition">attachment;filename=${@java.net.URLEncoder@encode(filename,"UTF-8")}</param>
       <param name="inputName">inputStream</param>
       </result>
</action>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值