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

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

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

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

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

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

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

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

新建一個(gè)Action類負(fù)責(zé)處理上傳的文件:

@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     文件擴(kuò)展名
     * @return 文件路徑
     * @throws IOException
     */
    public String saveFile(HttpServletRequest request, InputStream input, String ext) throws IOException {
        String realPath = request.getServletContext().getRealPath("/upload/file/"); // 取得服務(wù)器真實(shí)路徑
        File file = new File(realPath);
        if (!file.getParentFile().exists()) { // 目錄不存在
            file.mkdirs(); // 創(chuàng)建多級(jí)目錄
        }
        String filePath = realPath + UUID.randomUUID() + "." + ext;
        // 取的文件輸出流
        OutputStream out = new FileOutputStream(filePath);
        byte[] data = new byte[2048]; // 緩沖數(shù)組2KB
        int len = 0; // 讀取字節(jié)長(zhǎng)度
        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文件作為項(xiàng)目首頁(yè)展示。

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

啟動(dòng)項(xiàng)目,直接訪問(wèn):http://localhost:8080/將進(jìn)入index.html頁(yè)面。

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

SpringBoot對(duì)上傳文件處理的簡(jiǎn)化

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

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

修改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ù)器訪問(wèn)地址)
            // 文件保存再真實(shí)路徑下
            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;
    }
}

訪問(wèn):http://localhost:8080/

點(diǎn)擊上傳按鈕:

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

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

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

    mybatis如何使用Map接收返回值

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

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

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

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

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

    Mybatis或Mybatis-Plus框架的xml文件中特殊符號(hào)的使用詳解

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

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

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

    使用Sentinel滑動(dòng)窗口實(shí)現(xiàn)限流和降級(jí)

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

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

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

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

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

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

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

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

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

最新評(píng)論