Heim  >  Artikel  >  Java  >  Wie SpringBoot Funktionen zum Hochladen und Herunterladen von Dateien implementiert

Wie SpringBoot Funktionen zum Hochladen und Herunterladen von Dateien implementiert

WBOY
WBOYnach vorne
2023-05-16 08:46:121483Durchsuche

Hochladen und Herunterladen von Spring Boot-Dateien

Um in der tatsächlichen Webanwendungsentwicklung Dateien erfolgreich hochzuladen, muss die Methode des Formulars auf „Post“ und der Enctype auf „Multipart/Formulardaten“ eingestellt sein. Nur mit dieser Einstellung kann der Browser die Binärdaten der ausgewählten Datei an den Server senden.

Ab Servlet 3.0 wurden Methoden zum Verarbeiten von Datei-Uploads bereitgestellt, dieser Datei-Upload muss jedoch in Java Servlet abgeschlossen werden, und Spring MVC bietet eine einfachere Kapselung. Spring MVC implementiert eine MultipartResolver-Implementierungsklasse CommonsMultipartResolver über die Apache Commons FileUpload-Technologie, um den Datei-Upload abzuschließen. Daher muss der Datei-Upload von Spring MVC auf der Apache Commons FileUpload-Komponente basieren.

Spring MVC bindet die hochgeladene Datei automatisch an das MultipartFile-Objekt und stellt Methoden zum Abrufen des hochgeladenen Dateiinhalts, des Dateinamens usw. bereit und lädt die Datei über die transferTo-Methode auf die Festplatte des Servers hoch folgt:

  • byte[] getBytes(): Dateidaten abrufen.

  • String getContentType(): Ruft den MIME-Typ der Datei ab, z. B. Bild/JPEG usw.

  • InputStream getInputStream(): Den Dateistream abrufen.

  • String getName(): Ruft den Namen der Dateikomponente im Formular ab.

  • String getOriginalFilename(): Ruft den Originalnamen der hochgeladenen Datei ab.

  • long getSize(): Ermittelt die Bytegröße der Datei in Byte.

  • boolean isEmpty(): Ob es (Auswahl) gibt, eine Datei hochzuladen.

  • void transferTo(File dest): Speichern Sie die hochgeladene Datei in einer Zieldatei.

Das Spring-Boot-Starter-Web von Spring Boot verfügt über eine integrierte Spring MVC, sodass es bequemer ist, Spring Boot zum Hochladen von Dateien zu verwenden. Sie müssen nur die Abhängigkeit der Apache Commons FileUpload-Komponente einführen.

Beispiel

Im Folgenden wird der Implementierungsprozess des Hoch- und Herunterladens von Spring Boot-Dateien anhand eines Beispiels erläutert.

【Beispiel 7】Upload und Download der Spring Boot-Datei.

Die spezifischen Implementierungsschritte sind wie folgt.

1. Führen Sie die Abhängigkeit der Apache Commons FileUpload-Komponente ein

Fügen Sie in der Datei pom.xml der Webanwendung ch7_2 die Abhängigkeit der Apache Commons FileUpload-Komponente hinzu:

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

2 begrenzen

In der Webanwendung ch7_2 Fügen Sie in der Konfigurationsdatei application.properties die folgende Konfiguration hinzu, um die Größe der Upload-Datei zu begrenzen.

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

3. Erstellen Sie die Dateiauswahl-Ansichtsseite

Erstellen Sie im Verzeichnis src/main/resources/templates der ch7_2-Anwendung die Dateiauswahl-Ansichtsseite uploadFile.html. Auf dieser Seite gibt es ein Formular mit dem enctype-Attributwert multipart/form-data. Der spezifische Code lautet wie folgt:

<!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. Erstellen Sie einen Controller

Im com.ch.ch7_2.controller-Paket der ch7_2-Anwendung , erstellen Sie eine Controller-Klasse TestFileUpload. Es gibt 4 Verarbeitungsmethoden in dieser Klasse: Eine ist die Schnittstellennavigationsmethode uploadFile, eine ist die Upload-Methode zum Implementieren des Datei-Uploads, eine ist die showDownLoad-Methode zum Anzeigen der herunterzuladenden Datei und die andere ist die Download-Methode zum Implementieren Download-Funktion. Der Kerncode lautet wie folgt:

@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. Erstellen Sie eine Datei-Download-Ansichtsseite

Erstellen Sie im Verzeichnis src/main/resources/templates der ch7_2-Anwendung eine Datei-Download-Ansichtsseite showFile.html. Der Kerncode lautet wie folgt:

<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. Führen Sie

Zuerst die Ch72Application-Hauptklasse aus. Besuchen Sie dann http://localhost:8080/ch7_2/uploadFile, um das Hoch- und Herunterladen von Dateien zu testen.

Das obige ist der detaillierte Inhalt vonWie SpringBoot Funktionen zum Hochladen und Herunterladen von Dateien implementiert. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:yisu.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen