欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

SpringBoot實現(xiàn)文件上傳功能

 更新時間:2021年11月09日 14:13:56   作者:NicholasGUB  
這篇文章主要為大家詳細介紹了SpringBoot實現(xiàn)文件上傳功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下

經(jīng)典的文件上傳

服務(wù)器處理上傳文件一般都是先在請求中讀取文件信息,然后改變名稱保存在服務(wù)器的臨時路徑下,最后保存到服務(wù)器磁盤中。本次以thymeleaf搭建demo,因此需要引入thymeleaf依賴庫。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-thymeleaf</artifactId>
    <version>2.5.5</version>
</dependency>

如果使用的是gradle構(gòu)建的項目,需要修改build.gradle文件:

compile 'org.springframework.boot:spring-boot-starter-thymeleaf:2.5.5'

新建一個Action類負責處理上傳的文件:

@RestController
@RequestMapping("/upload/*")
public class UploadAction {

    @PostMapping("/file")
    public Object uploadHandler(HttpServletRequest request, String title, MultipartFile file) {
        Map<String, Object> resultMap = new LinkedHashMap<>();
        resultMap.put("title", title);
        resultMap.put("fileName", file.getName()); // 文件名
        resultMap.put("originalFilename", file.getOriginalFilename()); // 原始名稱
        resultMap.put("content-type", file.getContentType()); // 文件類型
        resultMap.put("fileSize", file.getSize() / 1024 + "K"); // 文件大小
        try {
            // 保存文件
            String uploadedFilePath = saveFile(request, file.getInputStream(), file.getOriginalFilename()
                    .substring(file.getOriginalFilename().lastIndexOf(".") + 1));
            resultMap.put("uploadedFilePath", uploadedFilePath); // 文件大小
        } catch (IOException e) {
            System.err.println("error-path: /upload/file, message: " + e.getMessage());
        }
        return resultMap;
    }

    /**
     * 保存上傳的文件到本地服務(wù)器
     *
     * @param request HttpServletRequest
     * @param input   輸入流
     * @param ext     文件擴展名
     * @return 文件路徑
     * @throws IOException
     */
    public String saveFile(HttpServletRequest request, InputStream input, String ext) throws IOException {
        String realPath = request.getServletContext().getRealPath("/upload/file/"); // 取得服務(wù)器真實路徑
        File file = new File(realPath);
        if (!file.getParentFile().exists()) { // 目錄不存在
            file.mkdirs(); // 創(chuàng)建多級目錄
        }
        String filePath = realPath + UUID.randomUUID() + "." + ext;
        // 取的文件輸出流
        OutputStream out = new FileOutputStream(filePath);
        byte[] data = new byte[2048]; // 緩沖數(shù)組2KB
        int len = 0; // 讀取字節(jié)長度
        while ((len = input.read(data)) != -1) {
            out.write(data, 0, len); // 文件寫入磁盤
        }
        if (input != null) {
            input.close();
        }
        out.close();
        return filePath;
    }
}

在resources目錄下新建templates文件夾,在里面創(chuàng)建index.html文件作為項目首頁展示。

<!doctype HTML>
<html xmlns:th="http://www.thymeleaf.org">
    <head>
        <title>文件上傳測試</title>
        <meta charset="UTF-8" />
    </head>
    <body>
        <form action="/upload/file" method="post" enctype="multipart/form-data">
            <span>標題:</span>
            <input type="text" name="title" /><br>
            <span>文件:</span>
            <input type="file" name="file" /><br>
            <input type="submit" value="上傳"  />
        </form>
    </body>
</html>

啟動項目,直接訪問:http://localhost:8080/將進入index.html頁面。

點擊上傳按鈕,文件將被保存到服務(wù)器磁盤中:

SpringBoot對上傳文件處理的簡化

SpringBoot對FileUpload組件進行了整合,在文件保存的時候可以避免直接操作IO流,通過配置文件的方式指定文件上傳的限制參數(shù)。修改application.yml文件:

server:
  port: 8080
spring:
  servlet:
    multipart:
      enabled: true  # 啟用文件上傳
      max-file-size: 1MB # 單文件上傳最大限制
      max-request-size: 10MB # 文件上傳最大值
      file-size-threshold: 10KB # 上傳文件達到多大時寫入磁盤
      location: / # 臨時文件存儲位置

修改UploadAction,使用MultipartFile類的transferTo方法保存上傳文件。

@RestController
@RequestMapping("/upload/*")
public class UploadAction {
    @PostMapping("/file")
    public Object uploadHandler(HttpServletRequest request, String title, MultipartFile file) {
        Map<String, Object> resultMap = new LinkedHashMap<>();
        resultMap.put("title", title);
        resultMap.put("fileName", file.getName()); // 文件名
        resultMap.put("originalFilename", file.getOriginalFilename()); // 原始名稱
        resultMap.put("content-type", file.getContentType()); // 文件類型
        resultMap.put("fileSize", file.getSize() / 1024 + "K"); // 文件大小
        try {
            // 保存文件
            String etc = file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf(".") + 1);
            String serverPath = request.getScheme() + "://" + request.getServerName()
                    + ":" + request.getServerPort() + request.getContextPath() + "/file/upload/";
            String fileName = UUID.randomUUID() + "." + etc;
            resultMap.put("filePath", serverPath + fileName); // 文件地址(服務(wù)器訪問地址)
            // 文件保存再真實路徑下
            File saveFile = new File(request.getServletContext().getRealPath("/file/upload/") + fileName);
            if (!saveFile.getParentFile().exists()) { // 目錄不存在,創(chuàng)建目錄
                saveFile.mkdirs();
            }
            file.transferTo(saveFile); // 保存上傳文件
        } catch (IOException e) {
            System.err.println("error-path: /upload/file, message: " + e.getMessage());
        }
        return resultMap;
    }
}

訪問:http://localhost:8080/

點擊上傳按鈕:

在瀏覽器上訪問filePath,可以預(yù)覽上傳的文件:

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • mybatis如何使用Map接收返回值

    mybatis如何使用Map接收返回值

    這篇文章主要介紹了mybatis如何使用Map接收返回值問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • 利用Java快速查找21位花朵數(shù)示例代碼

    利用Java快速查找21位花朵數(shù)示例代碼

    這篇文章主要給大家介紹了關(guān)于利用Java快速查找21位花朵數(shù)的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習,需要的朋友們下面隨著小編來一起學習學習吧。
    2017-10-10
  • Java實現(xiàn)鏈表的常見操作算法詳解

    Java實現(xiàn)鏈表的常見操作算法詳解

    這篇文章主要介紹了Java實現(xiàn)鏈表的常見操作算法詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-09-09
  • Mybatis或Mybatis-Plus框架的xml文件中特殊符號的使用詳解

    Mybatis或Mybatis-Plus框架的xml文件中特殊符號的使用詳解

    這篇文章主要介紹了Mybatis或Mybatis-Plus框架的xml文件中特殊符號的使用詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-11-11
  • 圖文淺析Java序列化和反序列化

    圖文淺析Java序列化和反序列化

    序列化(Serialization)是將對象的狀態(tài)信息轉(zhuǎn)化為可以存儲或者傳輸?shù)男问降倪^程,下面這篇文章主要給大家介紹了關(guān)于Java序列化和反序列化的相關(guān)資料,需要的朋友可以參考下
    2021-05-05
  • 使用Sentinel滑動窗口實現(xiàn)限流和降級

    使用Sentinel滑動窗口實現(xiàn)限流和降級

    Sentinel 是一個開源的高可用性、高擴展性的實時流量控制框架,它可以用于保護服務(wù)穩(wěn)定性,防止系統(tǒng)因為流量過大而崩潰,這篇文章我們所介紹的是滑動窗口,它是 Sentinel 實現(xiàn)限流和降級的重要組件之一,感興趣的同學跟著小編來看看吧
    2023-09-09
  • 利用Java提取PDF表格到文本、CSV及excel工作表

    利用Java提取PDF表格到文本、CSV及excel工作表

    如何精準地提取PDF格式中嵌入的表格數(shù)據(jù),并將其無縫轉(zhuǎn)換為更加易于分析和操作的形式,是一項重要的文檔處理技巧,本文將介紹如何利用Java從PDF文檔提取表格數(shù)據(jù),并寫入文本文件、CSV文件以及Excel工作表,需要的朋友可以參考下
    2024-09-09
  • 通過Feign進行調(diào)用@FeignClient?找不到的解決方案

    通過Feign進行調(diào)用@FeignClient?找不到的解決方案

    這篇文章主要介紹了通過Feign進行調(diào)用@FeignClient?找不到的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • 25行Java代碼將普通圖片轉(zhuǎn)換為字符畫圖片和文本的實現(xiàn)

    25行Java代碼將普通圖片轉(zhuǎn)換為字符畫圖片和文本的實現(xiàn)

    這篇文章主要介紹了25行Java代碼將普通圖片轉(zhuǎn)換為字符畫圖片和文本的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-04-04
  • SpringBoot實現(xiàn)動態(tài)控制定時任務(wù)支持多參數(shù)功能

    SpringBoot實現(xiàn)動態(tài)控制定時任務(wù)支持多參數(shù)功能

    這篇文章主要介紹了SpringBoot實現(xiàn)動態(tài)控制定時任務(wù)-支持多參數(shù)功能,本文通過實例代碼給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-05-05

最新評論