广告
返回顶部
首页 > 资讯 > 后端开发 > Python >SpringMVC教程之文件上传与下载详解
  • 627
分享到

SpringMVC教程之文件上传与下载详解

SpringMVC文件上传下载SpringMVC文件上传SpringMVC文件下载 2022-12-08 20:12:26 627人浏览 独家记忆

Python 官方文档:入门教程 => 点击学习

摘要

目录前言一、文件上传二、文件下载1.传统方式2.使用ResponseEntity方式前言 文件上传是项目开发中最常见的功能之一 ,springMVC 可以很好的支持文件上传,但是sp

前言

文件上传是项目开发中最常见的功能之一 ,springMVC 可以很好的支持文件上传,但是springmvc上下文中默认没有装配MultipartResolver,因此默认情况下其不能处理文件上传工作。如果想使用Spring的文件上传功能,则需要在上下文中配置MultipartResolver。

前端表单要求:为了能上传文件,必须将表单的method设置为POST,并将enctype设置为multipart/fORM-data。只有在这样的情况下,浏览器才会把用户选择的文件以二进制数据发送给服务器

<form action="" enctype="multipart/form-data" method="post">
    <input type="file" name="file"/>
    <input type="submit">
</form>

表单中enctype属性的详细说明:

  • application/x-www=form-urlencoded:默认方式,只处理表单域中的 value 属性值,采用这种编码方式的表单会将表单域中的值处理成 URL 编码方式。
  • multipart/form-data:这种编码方式会以二进制流的方式来处理表单数据,这种编码方式会把文件域指定文件的内容也封装到请求参数中,不会对字符编码。
  • text/plain:除了把空格转换为 “+” 号外,其他字符都不做编码处理,这种方式适用直接通过表单发送邮件。

一旦设置了enctype为multipart/form-data,浏览器即会采用二进制流的方式来处理表单数据,而对于文件上传的处理则涉及在服务器端解析原始的Http响应。在2003年,Apache Software Foundation发布了开源的Commons FileUpload组件,其很快成为Servlet/jsP程序员上传文件的最佳选择。

  • Servlet3.0规范已经提供方法来处理文件上传,但这种上传需要在Servlet中完成。而Spring MVC则提供了更简单的封装。
  • Spring MVC为文件上传提供了直接的支持,这种支持是用即插即用的MultipartResolver实现的。
  • Spring MVC使用Apache Commons FileUpload技术实现了一个MultipartResolver实现类:CommonsMultipartResolver。因此,SpringMVC的文件上传还需要依赖Apache Commons FileUpload的组件。

一、文件上传

【MultipartResolver】用于处理文件上传。当收到请求时,DispatcherServlet 的 checkMultipart() 方法会调用 MultipartResolver 的 isMultipart() 方法判断请求中【是否包含文件】。如果请求数据中包含文件,则调用 MultipartResolver 的 resolveMultipart() 方法对请求的数据进行解析,然后将文件数据解析成 MultipartFile 并封装在 MultiparthttpservletRequest (继承了 HttpServletRequest) 对象中,最后传递给 Controller。

我们可以看到DispatcherServlet的核心方法中第一句就是如下的代码:

try {
    processedRequest = checkMultipart(request);
    multipartRequestParsed = (processedRequest != request);
    ...

注意: MultipartResolver 默认不开启,需要手动开启。

文件上传对前端表单有如下要求:为了能上传文件,必须将表单的【method设置为POST】,并将enctype设置为【multipart/form-data】。只有在这样的情况下,浏览器才会把用户选择的文件以二进制数据发送给服务器。

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

application/x-www-form-urlencoded:默认方式,只处理表单域中的 value 属性值,采用这种编码方式的表单会将表单域中的值处理成 URL 编码方式。

multipart/form-data:这种编码方式会以二进制流的方式来处理表单数据,这种编码方式会把文件域指定文件的内容也封装到请求参数中,不会对字符编码。

<form action="" enctype="multipart/form-data" method="post">
   <input type="file" name="file"/>
   <input type="submit">
</form>

一旦设置了enctype为multipart/form-data,浏览器即会采用二进制流的方式来处理表单数据,而对于文件上传的处理则涉及在服务器端解析原始的HTTP响应。

1)导入这个【commons-fileupload】jar包,Maven会自动帮我们导入它的依赖包【commons-io】

<!--文件上传-->
<dependency>
   <groupId>commons-fileupload</groupId>
   <artifactId>commons-fileupload</artifactId>
   <version>1.3.3</version>
</dependency>

2)配置bean:multipartResolver

注意: 这个bena的id必须为:multipartResolver , 否则上传文件会报400的错误!

<!--文件上传配置-->
<bean id="multipartResolver" class="org.springframework.WEB.multipart.commons.CommonsMultipartResolver">
   <!-- 请求的编码格式,必须和jSP的pageEncoding属性一致,以便正确读取表单的内容,默认为ISO-8859-1 -->
   <property name="defaultEncoding" value="utf-8"/>
   <!-- 上传文件大小上限,单位为字节(10485760=10M) -->
   <property name="maxUploadSize" value="10485760"/>
   <property name="maxInMemorySize" value="40960"/>
</bean>

CommonsMultipartFile 的常用方法:

String getOriginalFilename():获取上传文件的原名

InputStream getInputStream():获取文件流

void transferTo(File dest):将上传文件保存到一个目录文件中

(3)编写前端页面

<form action="/upload" enctype="multipart/form-data" method="post">
 <input type="file" name="file"/>
 <input type="submit" value="upload">
</form>

(4)编写Controller类

package com.wang.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.commons.CommonsMultipartFile;
import javax.servlet.http.HttpServletRequest;
import java.io.*;
@Controller
public class FileController {
    //@RequestParam("file") 将name=file控件得到的文件封装成CommonsMultipartFile 对象
    //批量上传CommonsMultipartFile则为数组即可
    @RequestMapping("/upload")
    public String fileUpload(@RequestParam("file") CommonsMultipartFile file , HttpServletRequest request) throws IOException {
        //获取文件名 : file.getOriginalFilename();
        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(); //文件输入流
        OutputStream 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";
    }
}

(5)测试上传文件

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

编写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);
    //通过CommonsMultipartFile的方法直接写文件(注意这个时候)
    file.transferTo(new File(realPath +"/"+ file.getOriginalFilename()));
    return "redirect:/index.jsp";
}

小知识: 我们在文件上传可以考虑以下几点:

(1)文件的原始信息,或者叫文件的元数据是不是可以存在数据库,具体应该怎么做?

(2)文件的上传目录能不能写在配置文件当中,这个应该怎么做?

(3)文件上传到服务器后可不可以安装一定的规则分目录存储,比如日期?

(4)思考怎么使用阿里云的oss进行图片存储?

二、文件下载

第一种可以直接向response的输出流中写入对应的文件流

第二种可以使用 ResponseEntity<byte[]>来向前端返回文件

1.传统方式

文件下载步骤:

(1)设置 response 响应头

(2)读取文件 — InputStream

(3)写出文件 — OutputStream

(4)执行操作

(5)关闭流 (先开后关)

@GetMapping("/download1")
@ResponseBody
public R download1(HttpServletResponse response){
    FileInputStream fileInputStream = null;
    ServletOutputStream outputStream = null;
    try {
        // 这个文件名是前端传给你的要下载的图片的id
        // 然后根据id去数据库查询出对应的文件的相关信息,包括url,文件名等
        String  fileName = "wang.jpg";

        //1、设置response 响应头,处理中文名字乱码问题
        response.reset(); //设置页面不缓存,清空buffer
        response.setCharacterEncoding("UTF-8"); //字符编码
        response.setContentType("multipart/form-data"); //二进制传输数据
        //设置响应头,就是当用户想把请求所得的内容存为一个文件的时候提供一个默认的文件名。
        //Content-Disposition属性有两种类型:inline 和 attachment 
        //inline :将文件内容直接显示在页面 
        //attachment:弹出对话框让用户下载具体例子:
        response.setHeader("Content-Disposition",
                           "attachment;fileName="+ URLEncoder.encode(fileName, "UTF-8"));

		// 通过url获取文件
        File file = new File("D:/upload/"+fileName);
        //2、 读取文件--输入流
        fileInputStream = new FileInputStream(file);
        //3、 写出文件--输出流
        outputStream = response.getOutputStream();

        byte[] buffer = new byte[1024];
        int len;
        //4、执行写出操作
        while ((len = fileInputStream.read(buffer)) != -1){
            outputStream.write(buffer,0,len);
            outputStream.flush();
        }

        return R.success();
    } catch (IOException e) {
        e.printStackTrace();
        return R.fail();
    }finally {
        if( fileInputStream != null ){
            try {
                // 5、关闭输入流
                fileInputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        if( outputStream != null ){
            try {
                // 5、关闭输出流
                outputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

2.使用ResponseEntity方式

@GetMapping("/download2")
public ResponseEntity<byte[]> download2(){
    try {
        String fileName = "wang.jpg";
        byte[] bytes = FileUtils.readFileToByteArray(new File("D:/upload/"+fileName));
        HttpHeaders headers=new HttpHeaders();
        // Content-Disposition就是当用户想把请求所得的内容存为一个文件的时候提供一个默认的文件名。
        headers.set("Content-Disposition","attachment;filename="+ URLEncoder.encode(fileName, "UTF-8"));
        headers.set("charsetEncoding","utf-8");
        headers.set("content-type","multipart/form-data");
        ResponseEntity<byte[]> entity=new ResponseEntity<>(bytes,headers, HttpStatus.OK);
        return entity;
    } catch (IOException e) {
        e.printStackTrace();
        return null;
    }
}

到此这篇关于SpringMVC教程之文件上传与下载详解的文章就介绍到这了,更多相关SpringMVC文件上传下载内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: SpringMVC教程之文件上传与下载详解

本文链接: https://www.lsjlt.com/news/174585.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • SpringMVC教程之文件上传与下载详解
    目录前言一、文件上传二、文件下载1.传统方式2.使用ResponseEntity方式前言 文件上传是项目开发中最常见的功能之一 ,SpringMVC 可以很好的支持文件上传,但是Sp...
    99+
    2022-12-08
    SpringMVC文件上传下载 SpringMVC文件上传 SpringMVC文件下载
  • SpringMVC实现文件上传与下载
    本文实例为大家分享了SpringMVC实现文件上传与下载的具体代码,供大家参考,具体内容如下 0.环境准备 1.maven依赖 <dependencies> ...
    99+
    2022-11-12
  • SpringMVC文件上传与下载怎么实现
    这篇文章主要介绍“SpringMVC文件上传与下载怎么实现”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“SpringMVC文件上传与下载怎么实现”文章能帮助大家解决问题。前言文件上传是项目开发中最常...
    99+
    2023-07-04
  • Servlet文件的上传与下载详解
    目录文件的上传和下载1. 文件上传细节2. 文件上传3. 文件下载文件的上传和下载 1. 文件上传细节 要有一个 form 标签,method-post请求 (因为get有长度限制)...
    99+
    2022-11-13
  • SpringMVC实现上传下载文件
    本文实例为大家分享了SpringMVC实现上传下载文件的具体代码,供大家参考,具体内容如下 一、SpringMVC专门提供了CommonsMultipartResolver组件用于文...
    99+
    2022-11-13
  • JavaScript基础之文件上传与下载的实现详解
    目录一、文件上传1、普通文件上传2、大文件上传二、文件下载一、文件上传 1、普通文件上传 JavaScript 可以使用表单提交来实现文件上传。首先,在 HTML 中创建一个文件输入...
    99+
    2023-01-30
    JavaScript文件上传下载 JavaScript文件上传 JavaScript文件下载
  • springMVC实现文件上传和下载
    本文实例为大家分享了springMVC实现文件上传和下载的具体代码,供大家参考,具体内容如下 1准备工作 web.xml文件导入DispatcherServlet,Character...
    99+
    2022-11-12
  • 详解SpringMVC如何实现文件上传和下载功能
    小编这次要给大家分享的是详解SpringMVC如何实现文件上传和下载功能,文章内容丰富,感兴趣的小伙伴可以来了解一下,希望大家阅读完这篇文章之后能够有所收获。本文实例为大家分享了SpringMVC实现文件上传和下载的具体代码,供大家参考,具...
    99+
    2023-05-31
    springmvc 实现文件 如何实现
  • SpringMVC实现文件上传下载的全过程
    目录前言一、通用配置二、实现文件下载,上传功能总结前言 文件的上传和下载都是基于io复制,只不过 文件上传是浏览器向服务器发送报文 文件下载是服务器向浏览器发送报文 提示:以下是本篇...
    99+
    2022-11-12
  • IE8+SpringMVC文件上传防止JSON下载
    今天在IE8测试文件上传的时候发现总是提示下载,原因是上传接口返回的是json,通过以下修改就可以保证返回是json并且不会出现下载的情况:同时适用于当设置SPRING 视图解析器的时候,不能去掉@responseBody的问题@Reque...
    99+
    2023-05-31
    ie8 springmvc json
  • SpringMVC实现文件上传下载功能
    目录导入需要的依赖包一、单个文件上传二、多个文件上传三、上传文件列表显示四、文件下载今天遇到文件上传的问题,使用Ajax方式进行提交,服务器一直报错The current reque...
    99+
    2022-11-13
  • SpringMVC如何实现文件上传下载
    本篇内容主要讲解“SpringMVC如何实现文件上传下载”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“SpringMVC如何实现文件上传下载”吧!一、通用配置pom.xml  ...
    99+
    2023-06-22
  • SpringMVC深入讲解文件的上传下载实现
    目录SpringMVC文件下载SpringMVC文件上传1.基本介绍2.需求分析/图解3.应用实例4.Debug-file.transferTo(目标文件)SpringMVC文件下载...
    99+
    2022-11-13
  • SpringBoot文件上传与下载功能实现详解
    目录前言1、引入Apache Commons FileUpload组件依赖2、设置上传文件大小限制3、创建选择文件视图页面4、创建控制器5、创建文件下载视图页面前言 文件上传与下载是...
    99+
    2022-11-13
    SpringBoot文件上传 SpringBoot文件下载
  • SpringMVC使用ResponseEntity实现文件上传下载
    目录使用 ResponseEntity 实现文件上传和下载下载上传使用 ResponseEntity 实现文件上传和下载 在 static 下新建一个 img ,并且我放了一张图片在...
    99+
    2022-11-13
  • springMVC怎么实现文件上传和下载
    本篇内容介绍了“springMVC怎么实现文件上传和下载”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!本文实例为大家分享了springMVC...
    99+
    2023-06-20
  • 前端大文件上传与下载(分片上传)的详细过程
    目录一、问题二、解决1.第一步选择文件2.校验文件是否符合规范3.文件切片上传4.分片上传注意点5.大文件下载总结一、问题 日常业务中难免出现前端需要向后端传输大型文件的情况,这时单...
    99+
    2022-11-13
    前端文件上传和下载 前端上传文件 前端大文件上传
  • RestTemplate文件上传下载与大文件流式下载
    目录一、文件上传二、文件下载三、大文件下载本文是精讲RestTemplate第6篇,前篇的blog访问地址如下: RestTemplate在Spring或非Spring环境下使用精讲...
    99+
    2022-11-13
  • Flutter:文件上传与下载(下载后预览)
    Dio dio是一个强大的Dart Http请求库,提供了丰富的功能和易于使用的API,支持文件上传和下载。 这个就不介绍了,网上有很多的封装案例。 background_downloader 简介 ...
    99+
    2023-09-24
    flutter
  • SpringBoot+微信小程序实现文件上传与下载功能详解
    目录1、文件上传1.1 后端部分1.2 小程序前端部分1.3 实现效果2、文件下载2.1 后端部分2.2 小程序前端部分2.3 实现效果1、文件上传 1.1 后端部分 1.1.1 引...
    99+
    2022-11-13
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作