struts2文件上传下载

来源:互联网 发布:jojo超像可动淘宝 编辑:程序博客网 时间:2024/06/17 09:38

文件上传

文件上传的前提:

  • 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>
0 0
原创粉丝点击