Spring Boot基礎研究ノート14:ファイルアップロード機能の実現

ゼロ、学習目標

  1. SpringBootの使用をマスターしてファイルアップロード機能を実現する

1.ファイルアップロードの概要

Webアプリケーションを開発する場合、ファイルのアップロードは非常に一般的な要件です。ブラウザはファイルをフォームの形式のストリームの形式でサーバーに渡し、サーバーはアップロードされたデータを解析して処理します。SpringBootでのファイルのアップロードSpringMVCフレームワークに似ています。

次に、ファイルアップロード機能を実現します

(1)SpringBootプロジェクトを作成します

  • FileUploadDemoプロジェクトを作成し、WebとThymeleafの依存関係を追加します
    ここに画像の説明を挿入
    ここに画像の説明を挿入
    ここに画像の説明を挿入
    ここに画像の説明を挿入

(2)ブートストラップを統合する

  • 11番目の講義プロジェクトSpringMvcDemo2021のresources / staticのbootstrap-4.0.0を、現在のプロジェクトの対応する場所にコピーします。
    ここに画像の説明を挿入
    ここに画像の説明を挿入

ここに画像の説明を挿入

(3)ファイルアップロードページを書く

  • テンプレートディレクトリにファイルアップロードページを作成します-fileupload.html
    ここに画像の説明を挿入
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>文件上传</title>
    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
    <link th:href="@{/bootstrap-4.0.0/css/bootstrap.css}" rel="stylesheet"></link>
    <script th:src="@{/bootstrap-4.0.0/js/jquery-3.4.1.min.js}"></script>
    <script th:src="@{/bootstrap-4.0.0/js/bootstrap.bundle.js}"></script>
    <script th:src="@{/bootstrap-4.0.0/js/bootstrap.js}"></script>
    <script>
        function add() {
     
     
            var innerDiv = "<div>";
            innerDiv += "<input type='file' name='files' required='required' class='m-2'/>"
            innerDiv += "<input type='button' value='删除' οnclick='remove(this)'/>"
            innerDiv += "</div>";
            $("#file").append(innerDiv);
        }

        //删除整个文件上传div包括2个input
        function remove(obj) {
     
     
            $(obj).parent().remove();
            //$(obj).remove();// 仅删除按钮
        }

    </script>
</head>
<body>
<div class="col-xl-6 m-auto text-lg-left bg-info pt-3 pl-5">
    <div th:if="${uploadMsg}" th:text="${uploadMsg}" class="m-2 text-danger">恭喜,上传成功!</div>
    <form th:action="@{/uploadFile}" method="post" enctype="multipart/form-data">
        上传文件&nbsp;&nbsp;<input th:type="button" th:value="添加文件" th:onclick="add()" class="m-2"/>
        <div th:text="文件上传区域" id="file"></div>
        <input th:type="submit" value="上传" class="bg-info btn bg-warning m-2"/>
    </form>
</div>
</body>
</html>
  • フォームメソッドを使用する必要がありますpost
  • フォームのenctypeはmultipart/form-data
    ここに画像の説明を挿入

(4)プロジェクト構成ファイルをコンパイルします

ここに画像の説明を挿入

#thymeleaf配置
spring.thymeleaf.suffix=.html
spring.thymeleaf.mode=HTML5
spring.thymeleaf.cache=false
spring.thymeleaf.encoding=UTF-8
spring.thymeleaf.prefix=classpath:/templates/

#文件上传配置
#可多文件上传
spring.servlet.multipart.enabled=true
#单个文件大小50M
spring.servlet.multipart.max-file-size=52428800
#总文件大小300M
spring.servlet.multipart.max-request-size=314572800
  • 構成ファイルのアップロードファイルのサイズはMの単位ではなく、バイトであることに注意してください。
  • 50M = 50 * 1024 * 1024 B = 52428800 B
  • 300M = 300 * 1024 * 1024 B = 314572800 B

(5)ファイルアップロードコントローラーを作成する

ここに画像の説明を挿入

package net.hw.lesson14.controller;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.util.UUID;

/**
 * 功能:文件上传控制器
 * 作者:华卫
 * 日期:2021年02月28日
 */
@Controller
public class FileUploadController {
    
    
    @RequestMapping("/toFileUpload")
    public String toUpload(HttpServletRequest request, Model model) {
    
    
        return "fileupload";
    }
    
    @RequestMapping("/uploadFile")
    public String fileUpload(MultipartFile[] files, Model model, HttpServletRequest request) {
    
    
        // 定义上传目录
        File dir = new File("D://upload");
        try {
    
    
            if (!dir.exists()) {
    
    
                dir.mkdir();
            }
            for (int i = 0; i < files.length; i++) {
    
    
                MultipartFile file = files[i];
                String filename = UUID.randomUUID() + "_" + file.getOriginalFilename();
                InputStream in = file.getInputStream();
                FileOutputStream out = new FileOutputStream(new File(dir, filename));
                byte[] b = new byte[1024];
                int len;
                while ((len = in.read(b)) != -1) {
    
    
                    out.write(b, 0, len);
                }
                in.close();
                out.close();
                model.addAttribute("uploadMsg", "恭喜,文件上传成功!");
            }
        } catch (Exception e) {
    
    
            System.out.println(e.getMessage());
        }
        return "fileupload";
    }
}

ここに画像の説明を挿入

(6)アプリケーションを起動し、効果をテストします

  • アクセスhttp://localhost:8080/uploadFile
    ここに画像の説明を挿入
  • 正常にアップロードされたファイルを表示する
    ここに画像の説明を挿入
  • ファイルアップロードコントローラーのuploadFileメソッドのコードを変更します
    ここに画像の説明を挿入
  • アプリケーションを起動し、効果をテストします
    ここに画像の説明を挿入

3.クラス開発演習の後-アップロードされたファイルのタイプを制御します

  1. アップロードしたファイルのcontentType(String contentType = file.getContentType();)で判断でき、要件を満たすファイルがディスクに書き込まれます。そうでない場合はエラーメッセージが返されます。
  2. ファイルが指定されたサイズを超えている場合は、コントローラーで判断することもでき、フレンドリーなプロンプトがフロントデスクにフィードバックされます。
  3. フロントデスクでは、フォームを送信する前にjsを使用して予備的な判断を行うこともできます。

おすすめ

転載: blog.csdn.net/howard2005/article/details/114238918