• 使用springmvc进行文件的上传和下载


    文件的上传

    SpringMVC支持文件上传组件,commons-fileupload,commons-fileupload依赖commons-io组件

    配置步骤说明

    第一步:导入包 commons-fileupload组件

    第二步:配置springmvc支持上传组件

      1.启动springmvc注解支持

      2.配置上传解释器(对象名必须是固定的)

    第三步:构建一个上传表单

    第四步:在业务控制器编写保存上传文件的逻辑

     

    配置步骤:

    1.导入包

    2.配置文件的配置

    <!--启动注解的默认配置-->
     <mvc:annotation-driven />
    
    <!-- 文件上传解释器 -->
    <!-- 名字不能写错,一定是multipartResolver -->
    <bean name="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
      <!-- 默认编码 -->
      <property name="defaultEncoding" value="UTF-8"></property>
      <!-- 默认内存的大小 单位为b-->
    <!--   <property name="maxInMemorySize" value="512000000" ></property> -->
      <!-- 默认文件最大大小,b-->
      <property name="maxUploadSize" value="20000000"></property>
    
    </bean>

    此步骤注意事项:

      1.为什么需要一个注解的支持?因为需要<mvc:annotation-driven />来支持扩展注解,注解的支持类似系统补丁的方式打到框架里面

      如:对作用域request、session,放开静态资源的访问、上传组件、json 等都需要注解的支持<mvc:annotation-driven /> 

      2.文件上传解释器的对象名必须是固定的multipartResolver,因为multipartResolver是一个固定加载的属性

    3.上传表单

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>Insert title here</title>
    </head>
    <body>
    
      文件上传<br/>
      <!-- 要求
      1.method必须是POST
      2.内容类型:multipart/form-data
       -->
      <form action="${pageContext.request.contextPath }/upload.mvc" method="post" enctype="multipart/form-data">
         <input name="file" type="file"> <input type="submit" value="上传">
      </form>
    
    </body>
    </html>

    此步骤注意事项:

      1.method必须是post方式提交

      2.内容类型:multipart/form-data

    4.后台代码:

    package cn.gzsxt.controller;
    
    import java.io.File;
    import java.io.IOException;
    
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.multipart.MultipartFile;
    
    @Controller
    public class FileUploadController {
        
        
        /**
         * 注意接收上传文件的接口
         * SpringMVC的业务控制器执行方法,除了已经有内置对象的接口,可以声明接口。
         * 如果内内置对象声明接口会报错。
         * 原因,只有在执行方法上面放一个类或者接口,SpringMVC会先去容器查找是否否兼容类型的对象,
         * 如果有,就赋予给它,如果没有就会重新创建一个新的对象,如果声明了接口,容器原来没有,新创建的时候就会报错。
         * 
         * SpringMVC常见的内置对象有
         * 1.Model
         * 2.ModelMap
         * 3.HttpServletRequest
         * 4.HttpServletResponse
         * 5.HttpSession
         * 6.MultipartFile
         * @return
         */
        @RequestMapping(value="upload")
        public String upload(MultipartFile file){
            System.out.println("-文件上传-");
            //获得文件的原名
            System.out.println(file.getOriginalFilename());
            //创建一个文件
            File destfile=new File("D:/dir/"+file.getOriginalFilename());
            //将读取到的上传文件写入到destfile
            try {
                file.transferTo(destfile);
            } catch (IllegalStateException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
            return "/upload.jsp";
        }
    
    }

    如果需要同时上传多个文件,则还需要判断上传的文件是否为空!!!

    文件的下载

    1.读取本地的文件

    2.将读取的文件显示到页面上

    3.页面点击下载,下载文件

    代码:

    1.创建一个文件列表

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <%@taglib prefix="c"  uri="http://java.sun.com/jsp/jstl/core"%>    
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>Insert title here</title>
    <script type="text/javascript">
      /*
        将路径的参数编码.发送到后台方法在解码
      */
      function download(val){
          //将参数路径编码,Base64
          var filename=encodeURI(val); 
          //escape防止浏览器转义导致路径编码无法解释
          var path="${pageContext.request.contextPath }/download.mvc?fname="+escape(filename);
          //跳转到下载的路径
          window.location.href=path;
      }
    </script>
    </head>
    <body>
    文件列表
    <table border="1">
      <tr>
        <td>文件名</td>
        <td>下载</td>
      </tr>
      <c:forEach var="fileName" items="${fileNames }">
      <tr>
        <td>${fileName}</td>
        <td><a href="javascript:download('${fileName}')">下载</a></td>
      </tr>
      </c:forEach>
    </table>
    </body>
    </html>

    后台代码:

    import java.io.File;
    import java.io.IOException;
    import java.net.URLDecoder;
    import java.util.Arrays;
    
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    import org.apache.commons.io.FileUtils;
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    
    @Controller
    public class DownloadController {
        /**
         * 文件下载首先要有一个下载列表
         * @return
         */
        @RequestMapping(value="file-list")
        public String listFile(HttpServletRequest request){
            //1.读取文件夹 d:dir
            File dir =new File("d:/dir");
            //2.获得文件夹里面文件名
            String[] fileNames = dir.list();
            System.out.println(Arrays.toString(fileNames));
            //3.将文件名放在request
            request.setAttribute("fileNames", fileNames);
            return "/file-list.jsp";
        }
        
        /**
         * 文件下载
         * 所谓的文件下载就是将文件写入到HttpServletResponse里面
         */
        @RequestMapping(value="download")
        public void download(String fname,HttpServletResponse response){
            try {
            //解码
            fname=URLDecoder.decode(fname, "UTF-8");
            System.out.println(fname+"-----");
            //1.通过文件名获得文件
            File file=new File("d:/dir/"+fname);
            //将文件变成流,写入到HttpServletResponse的输出流里面
            //使用commons-io-2.2.jar的文件处理类实现,将文件转成一个byte[]字节流
             byte[] array=null;
        
                array = FileUtils.readFileToByteArray(file);
                //在response输出之前,设置输出的格式
                //默认不支持中文,new String(fname.getBytes(),"ISO-8859-1"),转义中文编码
                response.addHeader("Content-Disposition", "attachment;filename="+new String(fname.getBytes(),"ISO-8859-1"));
                //将文件写入到response的输出流
                response.getOutputStream().write(array);
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
  • 相关阅读:
    获取全部 txt 文本中出现次数最多的前N个词汇
    提取txt文本有效内容
    部分画图
    Series结构(常用)
    C 语言实例
    HTML之marquee(文字滚动)详解
    一款好看的404页面代码 | 滚动的404
    VS2010到VS2019各个版本的密钥
    什么是工程/项目?
    什么是IDE(集成开发环境)?
  • 原文地址:https://www.cnblogs.com/hq1997/p/10786439.html
Copyright © 2020-2023  润新知