Maison  >  Article  >  Java  >  Comment SpringBoot implémente les fonctions de téléchargement et de téléchargement de fichiers

Comment SpringBoot implémente les fonctions de téléchargement et de téléchargement de fichiers

WBOY
WBOYavant
2023-05-16 08:46:121450parcourir

Téléchargement et téléchargement de fichiers Spring Boot

Dans le développement réel d'applications Web, afin de télécharger avec succès des fichiers, la méthode du formulaire doit être définie sur post et l'enctype doit être défini sur multipart/form-data. Ce n'est qu'avec ce paramètre que le navigateur peut envoyer les données binaires du fichier sélectionné au serveur.

À partir de Servlet 3.0, des méthodes de gestion des téléchargements de fichiers ont été fournies, mais ce téléchargement de fichiers doit être effectué dans Java Servlet, et Spring MVC fournit une encapsulation plus simple. Spring MVC implémente une classe d'implémentation MultipartResolver CommonsMultipartResolver via la technologie Apache Commons FileUpload pour terminer le téléchargement de fichiers. Par conséquent, le téléchargement de fichiers de Spring MVC doit s'appuyer sur le composant Apache Commons FileUpload.

Spring MVC lie automatiquement le fichier téléchargé à l'objet MultipartFile. MultipartFile fournit des méthodes pour obtenir le contenu du fichier téléchargé, le nom du fichier, etc., et télécharge le fichier sur le disque du serveur via la méthode transferTo. Les méthodes courantes de MultipartFile sont les suivantes. suit :

  • byte[] getBytes() : récupère les données du fichier.

  • String getContentType() : récupère le type MIME du fichier, tel que image/jpeg, etc.

  • InputStream getInputStream() : récupère le flux de fichiers.

  • String getName() : récupère le nom du composant fichier dans le formulaire.

  • String getOriginalFilename() : Obtenez le nom d'origine du fichier téléchargé.

  • long getSize() : Obtenez la taille en octets du fichier, en octets.

  • boolean isEmpty() : s'il existe (choix) de télécharger un fichier.

  • void transferTo(File dest) : enregistrez le fichier téléchargé dans un fichier de destination.

Spring-boot-starter-web de Spring Boot a intégré Spring MVC, il est donc plus pratique d'utiliser Spring Boot pour télécharger des fichiers. Il vous suffit d'introduire la dépendance du composant Apache Commons FileUpload.

Exemple

Ce qui suit explique le processus de mise en œuvre du téléchargement et du téléchargement de fichiers Spring Boot à travers un exemple.

【Exemple 7】Téléchargement et téléchargement de fichiers Spring Boot.

Les étapes spécifiques de mise en œuvre sont les suivantes.

1. Introduisez la dépendance du composant Apache Commons FileUpload

Dans le fichier pom.xml de l'application Web ch7_2, ajoutez la dépendance du composant Apache Commons FileUpload Le code spécifique est le suivant :

<dependency>
    <groupId>commons-fileupload</groupId>
    <artifactId>commons-fileupload</artifactId>
    <!-- 由于commons-fileupload组件不属于Spring Boot,所以需要加上版本 -->
    <version>1.4</version>
</dependency>

2. limit

Dans l'application web ch7_2 Dans le fichier de configuration application.properties, ajoutez la configuration suivante pour limiter la taille des fichiers téléchargés.

#上传文件时,默认单个上传文件大小是1MB,max-file-size设置单个上传文件大小
spring.servlet.multipart.max-file-size=50MB
#默认总文件大小是10MB,max-request-size设置总上传文件大小
spring.servlet.multipart.max-request-size=500MB

3. Créez la page d'affichage de sélection de fichiers

Dans le répertoire src/main/resources/templates de l'application ch7_2, créez la page d'affichage de sélection de fichiers uploadFile.html. Il existe un formulaire avec la valeur d'attribut enctype multipart/form-data sur cette page. Le code spécifique est le suivant :

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<link rel="stylesheet" th:href="@{css/bootstrap.min.css}" />
<!-- 默认访问 src/main/resources/static下的css文件夹-->
<link rel="stylesheet" th:href="@{css/bootstrap-theme.min.css}" />
</head>
<body>
<div class="panel panel-primary">
    <div class="panel-heading">
      <h4 class="panel-title">文件上传示例</h4>
    </div>
  </div>
  <div class="container">
    <div class="row">
      <div class="col-md-6 col-sm-6">
        <form class="form-horizontal" action="upload" 
method="post" enctype="multipart/form-data">
          <div class="form-group">
            <div class="input-group col-md-6">
              <span class="input-group-addon">
                <i class="glyphicon glyphicon-pencil"></i>
              </span>
              <input class="form-control" type="text"
               name="description" th:placeholder="文件描述"/>
            </div>
          </div>
          <div class="form-group">
            <div class="input-group col-md-6">
              <span class="input-group-addon">
                <i class="glyphicon glyphicon-search"></i>
              </span>
              <input class="form-control" type="file"
               name="myfile" th:placeholder="请选择文件"/>
            </div>
          </div>
          <div class="form-group">
            <div class="col-md-6">
              <div class="btn-group btn-group-justified">
                <div class="btn-group">
                  <button type="submit" class="btn btn-success">
                    <span class="glyphicon glyphicon-share"></span>
                     上传文件
                  </button>
                </div>
              </div>
            </div>
          </div>
        </form>
      </div>
    </div>
  </div>
</body>
</html>

4 Créez un contrôleur

Dans le package com.ch.ch7_2.controller de l'application ch7_2. , créez une classe de contrôleur TestFileUpload. Il existe 4 méthodes de traitement dans cette classe, l'une est la méthode de navigation d'interface uploadFile, l'autre est la méthode de téléchargement qui implémente le téléchargement de fichiers, l'une est la méthode showDownLoad qui affiche le fichier à télécharger et l'autre est la méthode de téléchargement qui implémente le fonction de téléchargement. Le code principal est le suivant :

@Controller
public class TestFileUpload {
  @RequestMapping("/uploadFile")
  public String uploadFile() {
    return "uploadFile";
  }
  /**
   * 上传文件自动绑定到MultipartFile对象中,
   * 在这里使用处理方法的形参接收请求参数。
     */
  @RequestMapping("/upload")
  public String upload(
      HttpServletRequest request,
      @RequestParam("description") String description,
      @RequestParam("myfile") MultipartFile myfile)
throws IllegalStateException, IOException {
    System.out.println("文件描述:" + description);
    //如果选择了上传文件,将文件上传到指定的目录uploadFiles
    if(!myfile.isEmpty()) {
      //上传文件路径
      String path = request.getServletContext().getRealPath("/uploadFiles/");
      //获得上传文件原名
      String fileName = myfile.getOriginalFilename();
      File filePath = new File(path + File.separator + fileName);
      //如果文件目录不存在,创建目录
      if(!filePath.getParentFile().exists()) {
        filePath.getParentFile().mkdirs();
      }
      //将上传文件保存到一个目标文件中
      myfile.transferTo(filePath);
    }
    //转发到一个请求处理方法,查询将要下载的文件
    return "forward:/showDownLoad";
  }
  /**
   * 显示要下载的文件
   */
  @RequestMapping("/showDownLoad")
  public String showDownLoad(HttpServletRequest request, Model model) {
    String path = request.getServletContext().getRealPath("/uploadFiles/");
    File fileDir = new File(path);
    //从指定目录获得文件列表
    File filesList[] = fileDir.listFiles();
    model.addAttribute("filesList", filesList);
    return "showFile";
  }
  /**
   * 实现下载功能
   */
  @RequestMapping("/download")
  public ResponseEntity<byte[]> download(
      HttpServletRequest request,
      @RequestParam("filename") String filename,
      @RequestHeader("User-Agent") String userAgent) throws IOException {
    //下载文件路径
    String path = request.getServletContext().getRealPath("/uploadFiles/");
    //构建将要下载的文件对象
    File downFile = new File(path + File.separator + filename);
    //ok表示HTTP中的状态是200
    BodyBuilder builder = ResponseEntity.ok();
    //内容长度
    builder.contentLength(downFile.length());
    //application/octet-stream:二进制流数据(最常见的文件下载)
    builder.contentType(MediaType.APPLICATION_OCTET_STREAM);
    //使用URLEncoder.encode对文件名进行编码
    filename = URLEncoder.encode(filename,"UTF-8");
    /**
     * 设置实际的响应文件名,告诉浏览器文件要用于“下载”和“保存”。
     * 不同的浏览器,处理方式不同,根据浏览器的实际情况区别对待。
     */
    if(userAgent.indexOf("MSIE") > 0) {
      //IE浏览器,只需要用UTF-8字符集进行URL编码
      builder.header("Content-Disposition", "attachment; filename=" + filename);
    }else {
      /**非IE浏览器,如FireFox、Chrome等浏览器,则需要说明编码的字符集
       * filename后面有个*号,在UTF-8后面有两个单引号
       */
      builder.header("Content-Disposition", "attachment; filename*=UTF-8&#39;&#39;" + filename);
    }
    return builder.body(FileUtils.readFileToByteArray(downFile));
  }
}

5. Créez une page d'affichage de téléchargement de fichier

Dans le répertoire src/main/resources/templates de l'application ch7_2, créez une page d'affichage de téléchargement de fichier showFile.html. Le code principal est le suivant :

<body>
  <div class="panel panel-primary">
    <div class="panel-heading">
      <h4 class="panel-title">文件下载示例</h4>
    </div>
  </div>
  <div class="container">
    <div class="panel panel-primary">
      <div class="panel-heading">
        <h4 class="panel-title">文件列表</h4>
      </div>
      <div class="panel-body">
        <div class="table table-responsive">
          <table class="table table-bordered table-hover">
            <tbody class="text-center">
              <tr th:each="file,fileStat:${filesList}">
                <td>
                  <span th:text="${fileStat.count}"></span>
                </td>
                <td>
                <!--file.name相当于调用getName()方法获得文件名称 -->
                  <a th:href="@{download(filename=${file.name})}">
                    <span th:text="${file.name}"></span>
                  </a>
                </td>
              </tr>
            </tbody>
          </table>
        </div>
      </div>
    </div>
  </div>
</body>

6. Exécutez

Tout d'abord, exécutez la classe principale Ch72Application. Ensuite, visitez http://localhost:8080/ch7_2/uploadFile pour tester le téléchargement et le téléchargement de fichiers.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer