ホームページ  >  記事  >  Java  >  SpringBoot がファイルのアップロードおよびダウンロード機能を実装する方法

SpringBoot がファイルのアップロードおよびダウンロード機能を実装する方法

WBOY
WBOY転載
2023-05-16 08:46:121336ブラウズ

Spring Boot ファイルのアップロードとダウンロード

実際の Web アプリケーション開発では、ファイルを正常にアップロードするには、フォームのメソッドを post に設定し、enctype を multipart/form-data に設定する必要があります。 。この設定を使用した場合のみ、ブラウザは選択したファイルのバイナリ データをサーバーに送信できます。

Servlet 3.0 以降、ファイルのアップロードを処理するメソッドが提供されていますが、このファイルのアップロードは Java Servlet で完了する必要があり、Spring MVC はより単純なカプセル化を提供します。 Spring MVC は、Apache Commons FileUpload テクノロジーを介して MultipartResolver 実装クラス CommonsMultipartResolver を実装し、ファイルのアップロードを完了します。したがって、Spring MVC のファイルアップロードは、Apache Commons FileUpload コンポーネントに依存する必要があります。

Spring MVC は、アップロードされたファイルを MultipartFile オブジェクトに自動的にバインドします。MultipartFile には、アップロードされたファイルの内容、ファイル名などを取得するメソッドが用意されており、transferTo メソッドを通じてファイルをサーバーのディスクにアップロードします。

  • #byte[] getBytes(): ファイルデータを取得します。

  • String getContentType(): ファイルの MIME タイプ (image/jpeg など) を取得します。

  • InputStream getInputStream(): ファイル ストリームを取得します。

  • String getName(): フォーム内のファイル コンポーネントの名前を取得します。

  • String getOriginalFilename(): アップロードされたファイルの元の名前を取得します。

  • long getSize(): ファイルのバイト サイズをバイト単位で取得します。

  • boolean isEmpty(): (選択された) アップロード ファイルがあるかどうか。

  • void transferTo(File dest): アップロードされたファイルをターゲット ファイルに保存します。

Spring Boot の spring-boot-starter-web には Spring MVC が統合されているため、Spring Boot を使用してファイルをアップロードするとより便利です。Apache Commons FileUpload コンポーネントの依存関係を導入するだけで済みます。 。

以下では、Spring Boot ファイルのアップロードとダウンロードの実装プロセスを例を用いて説明します。

[例 7] Spring Boot ファイルのアップロードとダウンロード。

具体的な実装手順は次のとおりです。

1. Apache Commons FileUpload コンポーネントの依存関係を導入する

Web アプリケーション ch7_2 の pom.xml ファイルに、Apache Commons FileUpload コンポーネントの依存関係を追加します。具体的なコードは次のとおりです:

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

2 .アップロード ファイル サイズ制限の設定

Web アプリケーション ch7_2 の設定ファイル application.properties に、アップロード ファイル サイズを制限する次の設定を追加します。

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

3. ファイル選択ビュー ページの作成

ch7_2 アプリケーションの src/main/resources/templates ディレクトリに、ファイル選択ビュー ページ UploadFile.html を作成します。このページには enctype 属性値 multipart/form-data を持つフォーム form があり、具体的なコードは次のとおりです:

<!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. com.ch.ch7_2 にコントローラー

を作成しますch7_2 で適用されます。コントローラー パッケージで、コントローラー クラス TestFileUpload を作成します。このクラスには 4 つの処理メソッドがあり、1 つはインターフェイス ナビゲーション メソッドの UploadFile、1 つはファイルのアップロードを実装する Upload メソッド、1 つはダウンロードするファイルを表示する showDownLoad メソッド、もう 1 つはダウンロードするファイルを実装する Download メソッドです。ダウンロード機能。コア コードは次のとおりです:

@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. ファイル ダウンロード ビュー ページの作成

ch7_2 アプリケーションの src/main/resources/templates ディレクトリに、ファイル ダウンロード ビュー ページ showFile を作成します。 .html。コア コードは次のとおりです:

<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. Run

まず、Ch72Application メイン クラスを実行します。次に、http://localhost:8080/ch7_2/uploadFile にアクセスして、ファイルのアップロードとダウンロードをテストします。

以上がSpringBoot がファイルのアップロードおよびダウンロード機能を実装する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はyisu.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。