zoukankan      html  css  js  c++  java
  • 十六、Struts2文件上传与下载

    1. 文件上传与下载

      1.文件上传前提:<form action="${pageContext.request.contextPath}/*" method="post" enctype="multipart/form-data">

      2.动作类中字段需要符合命名规范

          表单字段名:image

          动作类:File image;

           String imageFileName; 文件名

                   String imageContentType;文件的MIME类型

      3.上传拦截器参数的配置

      文件大小、文件类型限制等

      错误消息提示:中文    

      4.多文件上传:File或者List数组

       

    2. 单文件上传

      开发步骤:

      Jsp代码:

      <br/> ----单文件上传----<br/>

      <s:form action="uploadOneAction" enctype="multipart/form-data">

              <s:textfield name="username" label="姓名"></s:textfield>

              <s:file name="photo" label="相片"></s:file>

              <s:submit value="上传"></s:submit>

      </s:form>

       

      Struts.xml文件配置代码:

      <package name="p1" extends="struts-default">

              <action name="uploadOneAction" class="com.itheima.action.UploadAction1">

                  <result>/success.jsp</result>

              </action>

      </package>

       

      动作类代码:

      public class UploadAction1 extends ActionSupport {

          // 变量命名需与表单名称保持一致

          private String username;

          // 与表单字段对应,必须是java.io.File类型的

          private File photo;

          // 上传的文件名,格式:上传字段+FileName

          private String photoFileName;

          // 上传文件MIME类型,格式:上传字段名+ContentType

          private String photoContentType;

       

          public String execute() throws Exception {

              // 打印相关字段属性

              System.out.println(username);

              System.out.println(photo);

              System.out.println(photoFileName);

              System.out.println(photoContentType);

              /*

               * 上传文件步骤:

               * 1.得到上传文件的真实路径

               * 2.构建输入流

               * 3.构建输出流

               */

              // 1.得到上传文件的真实路径

      //上传字段:上传到某个文件夹。存到应用的files目录下

              String storeDir = ServletActionContext.getServletContext().getRealPath(

                      "files");

              // 把上传过来的文件,重写创建一个文件

              File file = new File(storeDir, photoFileName);

       

              /*

              // 以前复制文件的方式

               * 但是现在呢?我们不需要这么做啦,Struts2都帮我们封装了

              InputStream in = new FileInputStream(photo);

              OutputStream out = new FileOutputStream(file);

       

              int len = 0;

              byte[] bys = new byte[1024];

              while ((len = in.read(bys)) != -1) {

                  out.write(bys, 0, len);

              }

              in.close();

              out.close();

              */

              FileUtils.copyFile(photo, file);

              return SUCCESS;

          }

      }

      2、多文件上传

      将文件类型定义为:List 或者File数组

      Jsp代码:

      <br>-----多文件上传-----<br>

      <form action="${pageContext.request.contextPath}/upload2.action" method="post" enctype="multipart/form-data">

          用户名:<input type="text" name="username"/><br/>

          靓照:<input type="file" name="photo"/><br/>

          靓照:<input type="file" name="photo"/><br/>

          <input type="submit" value="上传"/>

      </form>

       

      Struts.xml文件配置代码:

      <action name="upload2" class="com.itheima.actions.UploadAction2" method="upload">

      <!--             <interceptor-ref name="defaultStack"> -->

      <!--                 <param name="fileUpload.allowedTypes">image/jpeg,image/png</param> -->

      <!--                 <param name="fileUpload.allowedExtensionsSet">jpg,jpeg,png</param> -->

      <!--             </interceptor-ref> -->

                  <result>/success.jsp</result>

                  <result name="error">/error.jsp</result>

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

              </action>

       

      动作类代码:

      //文件上传:fileUpload拦截器完成的

      public class UploadAction2 extends ActionSupport {

          

          private String username;

          private File[] photo;//和表单的上传字段名保持一致。类型是File类型的 .数组或List

          private String[] photoFileName;//上传的文件名

          private String[] photoContentType;//上传文件的MIME类型

          public String upload(){

              //上传字段:上传到某个文件夹。存到应用的images目录下

              String realPath = ServletActionContext.getServletContext().getRealPath("/images");

              File directory = new File(realPath);

              if(!directory.exists()){

                  directory.mkdirs();

              }

              try {

                  for(int i=0;i<photo.length;i++){

                      FileUtils.copyFile(photo[i], new File(directory, photoFileName[i]));

                  }

                  return SUCCESS;

              } catch (IOException e) {

                  e.printStackTrace();

                  return ERROR;

              }

          }

      }

       

       

       

      3、原理分析:

      a、是由一个拦截器来完成的。fileUpload

      可以通过配置拦截器的参数,指定拦截的扩展名或文件的MIME类型

      <action name="uploadOneAction" class="com.itheima.action.UploadAction1">

                  <interceptor-ref name="defaultStack">

                  <!--对已有的拦截器注入参数 -->

                  <param name="fileUpload.allowedExtensions">txt</param>

                  </interceptor-ref>

                  <result>/success.jsp</result>

      </action>

       

      b、超出大小或非法文件的上传,会报错(转向一个input的视图)

       

      通过:

      <s:actionError/> <s:feildError/>显示错误消息的提示

      c、错误消息提示改为中文版:借助国际化的消息资源文件

       

      如果是通过配置全局默认参数引起的错误,最好用全局的消息资源文件。

       

       

      struts2默认的提示资源文件:struts2-core-**.jar 的org.apache.struts2的struts-message.properties文件中。比着key值覆盖对应的value即可。

      4、文件下载

      原理:是一个结果类型来处理的。stream

       

      编码步骤:

      动作类:

      public class DownloadAction extends ActionSupport {

          // 文件下载用到的输入流

          private InputStream imageFileIn;

          // 记住下载文件的文件名

          private String fileName;

       

          public String download1() throws Exception {

              // 给输入流赋值即可

              String realPath = ServletActionContext.getServletContext().getRealPath(

                      "/file/mm.jpg");

              // c:apacherfile4.jpg

              fileName = realPath.substring(realPath.lastIndexOf("\") + 1);

              // 解决中文名称乱码文件

              fileName = URLEncoder.encode(fileName, "UTF-8");

              imageFileIn = new FileInputStream(realPath);

              return SUCCESS;

          }

      }

       

      struts.xml配置文件:主要是对stream类型的结果进行配置

      <action name="download1" class="com.itheima.action.DownloadAction" method="download1">

                  <result type="stream">

                      <!--动作类中InputStream的字段名 -->

                      <param name="inputName">imageFileIn</param>

                      <!-- 告知浏览器响应头:文件的MIME类型 -->

                      <param name="contentType">application/octet-stream</param>

                      <!--告诉浏览器下载的方式 -->

                      <!-- 使用OGNL表达式获取动作类中的属性 -->

                      <param name="contentDisposition">attachment;filename=${fileName}</param>

                  </result>

      </action>

       

  • 相关阅读:
    如何自定义一个通信协议
    c++ 如何编写接口类(interface)
    QT国际化(中英转换)
    QT中文乱码与国际化支持
    frp官方中文文档
    K3 LEDE固件更改FRP客户端版本
    Linux下的tar压缩解压缩命令详解
    QT入门系列(3):控制台输出QString
    Delphi、Lazarus保留字、关键字详解
    使用TortoiseSVN的客户端钩子脚本触发Jenkins构建
  • 原文地址:https://www.cnblogs.com/Prozhu/p/5886462.html
Copyright © 2011-2022 走看看