11. 文件上传和下载

准备工作

​ springMVC可以很好的支持文件上传,但是SpringMVC上下文默认没有装配MultipartResolver,因此默认情况下不能处理文件上传工作。如果想实现,必须在上下文配置MultipartResolver

​ 前端表单要求:为了能上传文件,必须使用POST,并将enctype设置为multipart/form-data。浏览器可以把用户选择的文件以二进制数据发送给服务器。

对表单的enctype属性的详细说明

  • application/x-www=form-urlencoded:默认方式,只处理value值,表单域中的值会处理成URL编码。
  • multipart/form-data:二进制流的方式处理表单数据。封装到请求参数中,不会对字符编码。
  • text/plain:除了把空格转换成+号,其他字符不做编码处理,这种方式适合直接通过表单发送邮件。

Apache发布开源的Commons FileUpload组件:

  • Servlet 3.0规范已经提供方法来处理文件上传;
  • SpringMVC提供了更简单的封装;
  • 即插即用的MultipartResolver实现了这个功能;
  • SpringMVC使用Apache Commons FileUpload技术实现了一个MultipartResolver实现类。

文件上传

  1. 导入文件上传的jar包,commons-fileupload,Maven会自动帮我们导入她的依赖包 commons-io包:

    <!-- https://mvnrepository.com/artifact/commons-fileupload/commons-fileupload -->
    <dependency>
    <groupId>commons-fileupload</groupId>
    <artifactId>commons-fileupload</artifactId>
    <version>1.3.3</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
    <dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>4.0.1</version>
    </dependency>
  2. 配置bean:multipartResolver

    【注意!这个bean的id必须是multipartResolver,否则文件会报404】

    <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
    <!--请求的编码格式 必须和jsp的pageEncoding一致-->
    <property name="defaultEncoding" value="utf-8"/>
    <!--上传文件的大小上限 10M-->
    <property name="maxUploadSize" value="10485760"/>
    <property name="maxInMemorySize" value="40960"/>
    </bean>

CommonsMultipartFile的常用方法:

  • String getOriginalFilename():获取上传文件的原名;
  • InputStream getInputStream():获取文件流
  • void transferTo(File dest):将上传文件保存到一个目录文件
  1. 编写前端页面

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
    <title>$Title$</title>
    </head>
    <body>
    <form action="${pageContext.request.contextPath}/upload2" method="post" enctype="multipart/form-data">
    <input type="file" name="file">
    <input type="submit" value="upload">
    </form>
    </body>
    </html>
  2. Controller

    @RequestMapping("/upload")
    public String fileUpload(@RequestParam("file") CommonsMultipartFile file, HttpServletRequest request) throws IOException { String uploadFilename = file.getOriginalFilename(); if("".equals(uploadFilename)){
    return "redirect:/index.jsp";
    }
    System.out.println("上传文件名:"+uploadFilename); String path = request.getServletContext().getRealPath("/upload"); File realPath = new File(path);
    if (!realPath.exists())
    realPath.mkdir();
    System.out.println("文件保存地址:"+realPath); InputStream is = file.getInputStream();
    FileOutputStream os = new FileOutputStream(new File(realPath, uploadFilename)); int len=0;
    byte[] buffer = new byte[1024];
    while((len=is.read(buffer))!=-1){
    os.write(buffer,0,len);
    os.flush();
    }
    os.close();
    is.close();
    return "redirect:/index.jsp";
    }

采用file.Transto来保存上传的文件

  1. 编写Controller

    @RequestMapping("/upload2")
    public String fileUpload2(@RequestParam("file") CommonsMultipartFile file, HttpServletRequest request) throws IOException {
    String path = request.getServletContext().getRealPath("/upload"); File realPath = new File(path);
    if (!realPath.exists())
    realPath.mkdir();
    System.out.println("上传文件保存地址:"+realPath); file.transferTo(new File(realPath + "/" + file.getOriginalFilename()));
    return "redirect:/index.jsp";
    }
  2. 前端表单提交地址修改

  3. 访问提交测试

文件下载

步骤:

  1. 设置response请求头
  2. 读取文件--InputStream
  3. 写出文件--OutputStream
  4. 执行操作
  5. 关闭流
@RequestMapping("/download")
public String downloads(HttpServletResponse response,HttpServletRequest request) throws IOException {
String path = request.getServletContext().getRealPath("/upload");
String fileName="基础语法.jpg"; response.reset();
response.setCharacterEncoding("UTF-8");
response.setContentType("multipart/form-data"); response.setHeader("Content-Disposition",
"attachment;fileName="+ URLEncoder.encode(fileName,"UTF-8"));
File file = new File(path, fileName);
InputStream inputStream = new FileInputStream(file);
OutputStream outputStream = response.getOutputStream(); byte[] buffer = new byte[1024];
int index=0;
while((index=inputStream.read(buffer))!=-1){
outputStream.write(buffer,0,index);
outputStream.flush();
}
outputStream.close();
inputStream.close();
return null;
}

SpringMVC-11-文件上传和下载的更多相关文章

  1. SpringMVC 实现文件上传与下载,并配置异常页面

    目录 上传文件的表单要求 Spring MVC实现上传文件 需要导入的jar包 配置MultipartResolver解析器 编写接收上传文件的控制器 Spring MVC实现文件下载 下载文件时的h ...

  2. 使用springMVC实现文件上传和下载之环境配置与上传

    最近的项目中用到了文件的上传和下载功能,任务分配给了其他的同时完成.如今项目结束告一段落,我觉着这个功能比较重要,因此特意把它提取出来自己进行了尝试. 一. 基础配置: maven导包及配置pom.x ...

  3. springMvc之文件上传与下载

    我们经常会使用的一个功能是文件下载,既然有文件下载就会有文件上传,下面我们来看一下文件上传是如何实现的 首先准备好一个页面 <style type="text/css"> ...

  4. springmvc之文件上传、下载

    1.接收到的是图片的流时 //上传头像 @RequestMapping(value = "/uploadHeadSculpture", method = RequestMethod ...

  5. SpringMVC的文件上传与下载

    1. 单文件上传 配置jsp页面 <%@ page contentType="text/html;charset=UTF-8" language="java&quo ...

  6. 使用SpringMVC实现文件上传和下载

    文件上传 第一步,加入jar包: commons-fileupload-1.3.1.jar commons-io-2.4.jar 第二步,在SpringMVC配置文件中配置CommonsMultipa ...

  7. 【SpringMVC】文件上传与下载、拦截器、异常处理器

    文件下载 使用ResponseEntity实现下载文件的功能 index.html <!DOCTYPE html> <html lang="en" xmlns:t ...

  8. 使用springMVC实现文件上传和下载之文件下载

    接上一篇,文件下载需要获取下载文件的存储路径,这里只是手动填入,如果是在具体项目中,可以把文件名和上传后的存储路径保存在数据库中.然后增加一个文件列表的页面展示文件名和文件路径,然后点击下载的时候把相 ...

  9. 文件上传和下载(可批量上传)——Spring(二)

    针对SpringMVC的文件上传和下载.下载用之前“文件上传和下载——基础(一)”的依然可以,但是上传功能要修改,这是因为springMVC 都为我们封装好成自己的文件对象了,转换的过程就在我们所配置 ...

  10. 使用Spring MVC实现文件上传与下载

    前段时间做毕业设计的时候,想要完成一个上传文件的功能,后来,虽然在自己本地搭建了一个ftp服务器,然后使用公司的工具完成了一个文档管理系统:但是还是没有找到自己想要的文件上传与下载的方式. 今天看到一 ...

随机推荐

  1. MySQL元数据信息

    一.查看数据库清单 show databases; 二.查看数据库下表清单 方法1) show full tables from ${schema名}; 方法2) use ${数据库名}; show ...

  2. day1 计算机的组成

    1.计算机,是用于高速计算的电子机器,具有数值计算, 逻辑判断,储存记忆的功能. 2.计算机由硬件系统和软件系统组成构成. 3.计算机中所有的运行程序都是在内存中进行的,暂时存放在CPU中的运算数据 ...

  3. 洛谷T90444 密码 题解

    [问题描述] 假发通过了不懈的努力,得到了将军家门锁的密码(一串小写英文字母).但是假发被十四和猩猩他们盯上了,所以假发需要把密码传递出去.因为假发不想十四他们发现几松门前贴的小纸条就是将军家的密码, ...

  4. SpringBoot项目 使用Jenkins进行自动化部署 gitlab打tag 生产测试环境使用 含配置中心

    脚本 node('master') { def mvnHome = tool 'maven11-free' def gitUrl = "http://gitlab.wdcloud.cc:10 ...

  5. HTML5移动开发之路(1)——jqMobi中Side Menu实现(类似人人网)

    记得以前在做Native App的时候类似于人人网侧边滑动的效果非常的热,很多app仿照该效果进行开发,在jqMobi中也有类似的效果被称为Side Menu.下面我们来一步一步实现该效果. 首先新建 ...

  6. zookeeper基本配置以及一些坑

    配置 1. 解压安装包:tar zxvf zookeeper-3.4.14.tar.gz 2. 修改zookeeper配置: #Master cd zookeeper-3.4.14 #创建日志文件夹及 ...

  7. Java面试题(多线程篇)

    多线程 35.并行和并发有什么区别? 1.并行是指两个或者多个事件在同一时刻发生:而并发是指两个或多个事件在同一时间间隔发生. 2.并行是在不同实体上的多个事件,并发是在同一实体上的多个事件. 3.在 ...

  8. 如何发挥微博客在seo营销中的作用

    http://www.wocaoseo.com/thread-158-1-1.html 我们知道,现在微博客已经发展的相当成熟,普通一个人,只要会上网,就能开通属于自己的博客,进而可以时时地通过微博客 ...

  9. python+requests+unittest执行自动化接口测试

    1.安装requests.xlrd.json.unittest库 <1>pip 命令安装: pip install requestspip install xlrdpip install ...

  10. MES系统与喷涂设备软件基于文本文件的数据对接方案

    产品在生产过程中除了记录产品本身的一些数据信息,往往还需要记录下生产设备的一些参数和状态,这也是MES系统的一个重要功能.客户的药物支架产品,需要用到微量药物喷涂设备,客户需要MES系统能完整记录下每 ...