SpringBoot實現文件上傳①


前言:在web開發中,文件上傳是必不可少的一部分。比如頭像上傳,添加商品、上傳圖片等等需求......就是把文件上傳保存到服務器的過程。

單文件上傳

實現步驟

01、搭建項目

搭建一個SpringBoot項目

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.6.0</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.qd</groupId>
    <artifactId>uploadDemo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>uploadDemo</name>
    <description>文件上傳demo</description>
    <properties>
        <java.version>1.8</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-freemarker</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>
server:
  port: 8082 # 應用端口

spring:
  # freemarker
  freemarker:
    suffix: .html
    cache: false
  # 文件上傳配置
  servlet:
    multipart:
      # 是否開啟http上傳處理
      enabled: true
      # 單個文件最大長度
      max-file-size: 2MB
      # 最大請求文件的大小
      max-request-size: 10MB
      # 設置臨時目錄
      # location: F://data//temp

02、准備文件上傳頁面

resources/templates/新增upload.html頁面

package com.qd.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;

/**
 * Create by IntelliJ IDEA
 *
 * @Author: qiandu
 * @Blog: https://www.cnblogs.com/qd666
 * @Date: 2021/11/21 21:01
 */
@Controller
public class UploadController {

    @GetMapping("/upload")
    public String toUpload() {
        return "upload";
    }
}

03、后台實現

UploadService

package com.qd.service;

import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;

/**
 * 文件上傳
 *
 * @Author: qiandu
 * @Blog: https://www.cnblogs.com/qd666
 * @Date: 2021/11/21 21:20
 */
@Service
public class UploadService {

    /**
     * MultipartFile 對象是springMVC提供的文件上傳接收的類
     * 文件上傳底層原理 request.getInpuStream()
     *
     * @param multipartFile
     * @param dir
     * @return
     */
    public String uploadImg(MultipartFile multipartFile, String dir) {

        // 1:指定文件上傳的目錄
        File targetFile = new File("D:\\tmp\\" + dir);

        try {
            // 2:如果targetFile不存在,則創建
            if (!targetFile.exists()) targetFile.mkdirs();
            // 3: 指定文件上傳后的目錄
            File targetFileName = new File(targetFile, "1.png"); // 先寫死
            // 4:文件上傳到指定的目錄
            multipartFile.transferTo(targetFileName);
            return "ok";
        } catch (IOException e) {
            e.printStackTrace();
            return "fail";
        }
    }
}

UploadController

package com.qd.controller;

import com.qd.service.UploadService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletRequest;

/**
 * Create by IntelliJ IDEA
 *
 * @Author: qiandu
 * @Blog: https://www.cnblogs.com/qd666
 * @Date: 2021/11/21 21:01
 */
@Controller
public class UploadController {

    @Autowired
    private UploadService uploadService;


    @GetMapping("/upload")
    public String toUpload() {
        return "upload";
    }

    @PostMapping("/upload/file")
    @ResponseBody
    public String upload(@RequestParam("file") MultipartFile multipartFile, HttpServletRequest request) {

        // 1:空判斷
        if (multipartFile.isEmpty()) {
            return "文件為空!!!";
        }

        multipartFile.getSize();//得到大小
        multipartFile.getOriginalFilename();//得到文件名
        String contentType = multipartFile.getContentType();//得到文件類型

        // 2:判斷文件是否符合
        if (!"image/png".equals(contentType) || !"image/jpg".equals(contentType)) {
            return "文件格式不符合";
        }

        // 3:獲取用戶指定的文件夾
        // 目的:作隔離,不同業務、不同文件放入到不同的目錄中
        String dir = request.getParameter("dir");
        return uploadService.uploadImg(multipartFile, dir);
    }
}

web頁面

    <h2>文件上傳</h2>
    <form action="/upload/file" method="post" enctype="multipart/form-data">
        <input type="text" name="dir" value="avatar" hidden>
        <input type="file" name="file" accept="image/png,image/jpg">
        <input type="submit" value="點我上傳">
    </form>

結果
在這里插入圖片描述

04、后台改進

上面的還有問題的,比如上傳后的文件名稱被寫死,目錄頁應該按照年月日層級划分

package com.qd.service;

import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.UUID;

/**
 * 文件上傳
 *
 * @Author: qiandu
 * @Blog: https://www.cnblogs.com/qd666
 * @Date: 2021/11/21 21:20
 */
@Service
public class UploadService {

    /**
     * MultipartFile 對象是springMVC提供的文件上傳接收的類
     * 文件上傳底層原理 request.getInpuStream()
     *
     * @param multipartFile
     * @param dir
     * @return
     */
    public String uploadImg(MultipartFile multipartFile, String dir) {

        try {
            // 1:真實的文件名稱
            String originalFilename = multipartFile.getOriginalFilename(); // 上傳的文件aa.jpg
            // 2:截取后的文件名稱 .jpg
            String imgSuffix = originalFilename.substring(originalFilename.lastIndexOf(".")); // 得到.jpg
            // 3:生成唯一的文件名稱
            String newFileName = UUID.randomUUID().toString() + imgSuffix;  // 隨機生成如:dfasf42432.jpg
            // 4:日期作為目錄隔離文件
            SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd");
            String datePath = dateFormat.format(new Date()); // 日期目錄:2021/11/21
            // 5:最終文件的上傳目錄
            File targetFile = new File("D:\\tmp\\" + dir, datePath); // 生成的最終目錄; D://tmp/avatar/2021/11/21
            // 6:如果dirFile不存在,則創建
            if (!targetFile.exists()) targetFile.mkdirs();
            // 7: 指定文件上傳后完整的文件名
            File dirFileName = new File(targetFile, newFileName); // 文件在服務器的最終路徑是:D://tmp/avatar/2021/11/21/dfasf42432.jpg
            // 8:文件上傳
            multipartFile.transferTo(dirFileName);
            return "ok";
        } catch (IOException e) {
            e.printStackTrace();
            return "fail";
        }
    }
}

結果
在這里插入圖片描述

05、前台改進

目前,前端需要先選擇上傳的圖片,然后需要點擊上傳按鈕,方能上傳。那能不能改進才只要選中圖片即可自動上傳呢?

    <h2>文件上傳</h2>
    <form action="/upload/file" id="uploadform" method="post" enctype="multipart/form-data">
        <input type="text" name="dir" value="avatar" hidden>
        <input type="file" name="file" accept="image/png,image/jpg" onchange="upload()">
        <!--<input type="submit" value="點我上傳">-->
    </form>

    <script>
        function upload() {
            console.log("選擇圖片即可上傳~")
            document.getElementById("uploadform").submit();
        }
    </script>

ok~到這里本地的單文件上傳就學習的差不多了,隨之我們又遇到了另外一個問題:怎么獲取上傳的圖片呢? 那么接下來將解決這個問題。

獲取文件

文件可訪問路徑:http://localhost:8082/avatar/2021/11/21/dfasf42432.jpg

	// 9:可訪問的路徑 http://localhost:8082/avatar/2021/11/21/dfasf42432.jpg
	String fileName = dir + "/" + datePath + "/" + newFileName;
	return fileName;

在這里插入圖片描述
但是此時仍然無法訪問,怎么解決呢?———上傳至服務器目錄 即當前tomcat服務器下webapps/目錄

SpringBoot如何指定任意目錄為資源的訪問目錄呢?

我們知道SpringBoot有一個目錄static 在這個目錄下的文件可以是直接通過http請求訪問到的,但是程序會被打成jar包,文件無法寫入,所以SpringBoot提供一個資源目錄映射的機制。接下來我們嘗試一下。

01、新建配置類

package com.qd.config;

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

/**
 * 靜態資源映射配置類
 *
 * @Author: qiandu
 * @Blog: https://www.cnblogs.com/qd666
 * @Date: 2021/11/22 5:50
 */
@Configuration
public class WebMvcConfiguration implements WebMvcConfigurer {

    // 配置文件上傳的額外的靜態資源配置
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        //  registry.addResourceHandler("/資源的訪問路徑").addResourceLocations("映射目錄");
        registry.addResourceHandler("/uploadImg/**").addResourceLocations("file:D://tmp//");
    }
}

分析:如果你將文件上傳到了D://tmp目錄 可以通過http://localhost:8082/uploadImg/aa.jpg訪問。訪問測試
在這里插入圖片描述
ok,到了這一步還是有問題的,在前面我們將 addResourceLocations("file:D://tmp//")寫死了,細想一下,它如果是linux系統呢?是不是還要繼續改進。

02、改進

WebMvcConfiguration 配置類改進

package com.qd.config;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

/**
 * 靜態資源映射配置類
 *
 * @Author: qiandu
 * @Blog: https://www.cnblogs.com/qd666
 * @Date: 2021/11/22 5:50
 */
@Configuration
public class WebMvcConfiguration implements WebMvcConfigurer {

    @Value("${file.staticPatterPath}")
    private String staticPatterPath;
    @Value("${file.uploadFolder}")
    private String uploadFolder;
    
    // 配置文件上傳的額外的靜態資源配置
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        //  registry.addResourceHandler("/資源的訪問路徑").addResourceLocations("映射目錄");
        registry.addResourceHandler(staticPatterPath + "**").addResourceLocations("file:" + uploadFolder);
    }
}

新建yml文件作環境隔離

# 本機配置
file:
  rootPath: http://localhost:8082
  staticPatterPath: /uploadImg/
  uploadFolder: D:/tmp/


# 服務器配置
file:
  rootPath: https://www.xxx.com
  staticPatterPath: /uploadImg/
  uploadFolder: /www/upload/

改進service

package com.qd.service;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.UUID;

/**
 * 文件上傳
 *
 * @Author: qiandu
 * @Blog: https://www.cnblogs.com/qd666
 * @Date: 2021/11/21 21:20
 */
@Service
public class UploadService {

    // 根路徑
    @Value("${file.rootPath}")
    private String rootPath;
    // 映射目錄
    @Value("${file.uploadFolder}")
    private String uploadFolder;
    // 資源的訪問路徑
    @Value("${file.staticPatterPath}")
    private String staticPatterPath;

    /**
     * MultipartFile 對象是springMVC提供的文件上傳接收的類
     * 文件上傳底層原理 request.getInpuStream()
     *
     * @param multipartFile
     * @param dir
     * @return
     */
    public String uploadImg(MultipartFile multipartFile, String dir) {

        try {
            // 1:真實的文件名稱
            String originalFilename = multipartFile.getOriginalFilename(); // 上傳的文件aa.jpg
            // 2:截取后的文件名稱 .jpg
            String imgSuffix = originalFilename.substring(originalFilename.lastIndexOf(".")); // 得到.jpg
            // 3:生成唯一的文件名稱
            String newFileName = UUID.randomUUID().toString() + imgSuffix;  // 隨機生成如:dfasf42432.jpg
            // 4:日期作為目錄隔離文件
            SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd");
            String datePath = dateFormat.format(new Date()); // 日期目錄:2021/11/21
            // 5:最終文件的上傳目錄
            File targetFile = new File(uploadFolder + dir, datePath); // 生成的最終目錄; D://tmp/avatar/2021/11/21
            // 6:如果dirFile不存在,則創建
            if (!targetFile.exists()) targetFile.mkdirs();
            // 7: 指定文件上傳后完整的文件名
            File dirFileName = new File(targetFile, newFileName); // 文件在服務器的最終路徑是:D://tmp/avatar/2021/11/21/dfasf42432.jpg
            // 8:文件上傳
            multipartFile.transferTo(dirFileName);

            // 9:可訪問的路徑 http://localhost:8082/avatar/2021/11/21/dfasf42432.jpg
            String fileName = dir + "/" + datePath + "/" + newFileName;
            return rootPath +staticPatterPath+ fileName;
        } catch (IOException e) {
            e.printStackTrace();
            return "fail";
        }
    }
}

03、獲取文件多個信息

返回map即可

UploadService

package com.qd.service;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;
import java.io.StringReader;
import java.text.SimpleDateFormat;
import java.util.*;

/**
 * 文件上傳
 *
 * @Author: qiandu
 * @Blog: https://www.cnblogs.com/qd666
 * @Date: 2021/11/21 21:20
 */
@Service
public class UploadService {

    // 根路徑
    @Value("${file.rootPath}")
    private String rootPath;
    // 映射目錄
    @Value("${file.uploadFolder}")
    private String uploadFolder;
    // 資源的訪問路徑
    @Value("${file.staticPatterPath}")
    private String staticPatterPath;

    /**
     * MultipartFile 對象是springMVC提供的文件上傳接收的類
     * 文件上傳底層原理 request.getInpuStream()
     *
     * @param multipartFile
     * @param dir
     * @return
     */
    public Map<String, Object> uploadImgMap(MultipartFile multipartFile, String dir) {

        try {
            // 1:真實的文件名稱
            String originalFilename = multipartFile.getOriginalFilename(); // 上傳的文件aa.jpg
            // 2:截取后的文件名稱 .jpg
            String imgSuffix = originalFilename.substring(originalFilename.lastIndexOf(".")); // 得到.jpg
            // 3:生成唯一的文件名稱
            String newFileName = UUID.randomUUID().toString() + imgSuffix;  // 隨機生成如:dfasf42432.jpg
            // 4:日期作為目錄隔離文件
            SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd");
            String datePath = dateFormat.format(new Date()); // 日期目錄:2021/11/21
            // 5:最終文件的上傳目錄
            File targetFile = new File(uploadFolder + dir, datePath); // 生成的最終目錄; D://tmp/avatar/2021/11/21
            // 6:如果dirFile不存在,則創建
            if (!targetFile.exists()) targetFile.mkdirs();
            // 7: 指定文件上傳后完整的文件名
            File dirFileName = new File(targetFile, newFileName); // 文件在服務器的最終路徑是:D://tmp/avatar/2021/11/21/dfasf42432.jpg
            // 8:文件上傳
            multipartFile.transferTo(dirFileName);

            // 9:可訪問的路徑 http://localhost:8082/avatar/2021/11/21/dfasf42432.jpg
            String fileName = dir + "/" + datePath + "/" + newFileName;
            Map<String, Object> map = new HashMap<>();
            map.put("url", rootPath + staticPatterPath + fileName); // url
            map.put("size", multipartFile.getSize());// 大小
            map.put("fileName", originalFilename);// 真實文件名稱
            map.put("ext", imgSuffix);// 后綴名
            return map;
        } catch (IOException e) {
            e.printStackTrace();
            return null;
        }
    }
}

UploadController

package com.qd.controller;

import com.qd.service.UploadService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletRequest;
import java.util.Map;

/**
 * Create by IntelliJ IDEA
 *
 * @Author: qiandu
 * @Blog: https://www.cnblogs.com/qd666
 * @Date: 2021/11/21 21:01
 */
@Controller
public class UploadController {

    @Autowired
    private UploadService uploadService;

    @GetMapping("/upload")
    public String toUpload() {
        return "upload";
    }
    
    @PostMapping("/upload/file2")
    @ResponseBody
    public Map<String, Object> uploadMap(@RequestParam("file") MultipartFile multipartFile, HttpServletRequest request) {

        // 1:空判斷
        if (multipartFile.isEmpty()) {
            return null;
        }

        // 2:判斷文件是否符合
        //String contentType = multipartFile.getContentType();//得到文件類型
        //if (!"image/png".equals(contentType) || !"image/jpg".equals(contentType)) {
        //    return "文件格式不符合";
        //}

        // 3:獲取用戶指定的文件夾
        // 目的:作隔離,不同業務、不同文件放入到不同的目錄中
        String dir = request.getParameter("dir");
        return uploadService.uploadImgMap(multipartFile, dir);
    }
}

前端

    <h2>文件上傳</h2>
    <form action="/upload/file2" id="uploadform" method="post" enctype="multipart/form-data">
        <input type="text" name="dir" value="avatar" hidden>
        <input type="file" name="file" accept="image/png,image/jpg" onchange="upload()">
        <!--<input type="submit" value="點我上傳">-->
    </form>

    <script>
        function upload() {
            console.log("選擇圖片即可上傳~")
            document.getElementById("uploadform").submit();
        }
    </script>

結果
在這里插入圖片描述

多文件上傳

方法一

01、controller層多文件上傳接口方法

    /**
     * 多文件按上傳
     *
     * @param multipartFiles
     * @param request
     * @return
     */
    @PostMapping("/upload/batchUpload")
    @ResponseBody
    public List<Map<String, Object>> batchUpload(@RequestParam("file") MultipartFile[] multipartFiles, HttpServletRequest request) {
        if (multipartFiles.length < 0) {
            return new ArrayList<>();
        }
        // 獲取用戶指定的文件夾,業務隔離
        String dir = request.getParameter("dir");
        return uploadService.batchUpload(multipartFiles, dir);
    }

tips:multipartFiles定義成數組,即可接收多文件

02、service層多文件上傳方法

 	/**
     * 多文件上傳
     *
     * @param multipartFiles
     * @return
     */
    public List<Map<String, Object>> batchUpload(MultipartFile[] multipartFiles, String dir) {


        ArrayList<Map<String, Object>> list = new ArrayList<>();

        try {
            // 1:遍歷獲取每個上傳的文件
            for (int i = 0; i < multipartFiles.length; i++) {
                MultipartFile multipartFile = multipartFiles[i];
                // 2:獲取文件名
                String originalFilename = multipartFile.getOriginalFilename();
                // 3:取文件名后綴
                String suffix = originalFilename.substring(originalFilename.lastIndexOf("."));
                // 4:文件重命名
                String newFileName = UUID.randomUUID().toString() + suffix;
                // 5:日期目錄
                SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy/MM/dd");
                String datePath = simpleDateFormat.format(new Date());
                // 6:上傳目錄
                File targetFile = new File(uploadFolder + dir, datePath);
                // 7:如果目錄不存在,遞歸創建
                if (!targetFile.exists()) targetFile.mkdirs();
                // 8:文件上傳目錄
                File dirFileName = new File(targetFile, newFileName);
                // 9:文件上傳
                multipartFile.transferTo(dirFileName);

                // 10:路徑拼接
                String fileUrl = dir + "/" + datePath + "/" + newFileName;
                // 11:完整訪問路徑
                String linkUrl = rootPath + staticPatterPath + fileUrl;

                Map<String, Object> map = new HashMap<>();
                map.put("url", linkUrl); // url
                map.put("size", multipartFile.getSize());// 大小
                map.put("fileName", originalFilename);// 真實文件名稱
                map.put("ext", suffix);// 后綴名
                list.add(map);
            }
            return list;
        } catch (IOException e) {
            e.printStackTrace();
            return new ArrayList<>();
        }
    }

03、前端頁面

    <h2>文件上傳</h2>
    <form action="/upload/batchUpload" id="uploadform" method="post" enctype="multipart/form-data">
        <input type="text" name="dir" value="avatar" hidden>
        <input type="file" name="file" multiple accept="image/png,image/jpg" onchange="upload()">
        <!--<input type="submit" value="點我上傳">-->
    </form>

    <script>
        function upload() {
            console.log("選擇圖片即可上傳~")
            document.getElementById("uploadform").submit();
        }
    </script>

測試結果
在這里插入圖片描述

方法二

01、controller層多文件上傳接口方法

	/**
     * 多文件按上傳
     *
     * @param request
     * @return
     */
    @PostMapping("/upload/batchUpload2")
    @ResponseBody
    public List<Map<String, Object>> batchUpload2(HttpServletRequest request) {

        // 1:得到 MultipartHttpServletRequest
        // MultipartHttpServletRequest接口簡單地擴展了默認的HttpServletRequest接口,並提供一些用來處理請求文件的方法。
        MultipartHttpServletRequest multipartHttpServletRequest = (MultipartHttpServletRequest) request;
        // 2:獲取上傳文件列表,字段file由前台表單指定
        List<MultipartFile> fileList = multipartHttpServletRequest.getFiles("file");
        // 3:判斷文件是否為空
        if (fileList.size() == 0) {
            return new ArrayList<>();
        }
        // 4:獲取用戶指定的文件夾,業務隔離
        String dir = request.getParameter("dir");
        return uploadService.batchUpload2(fileList, dir);
    }

02、service層多文件上傳方法

	/**
     * 多文件上傳
     *
     * @param multipartFiles
     * @param dir
     * @return
     */
    public List<Map<String, Object>> batchUpload2(List<MultipartFile> multipartFiles, String dir) {

        // 1:存放所有文件信息
        ArrayList<Map<String, Object>> list = new ArrayList<>();
        for (MultipartFile multipartFile : multipartFiles) {
            try {
                // 2:獲取文件名
                String originalFilename = multipartFile.getOriginalFilename();
                // 3:取文件名后綴
                String suffix = originalFilename.substring(originalFilename.lastIndexOf("."));
                // 4:文件重命名
                String newFileName = UUID.randomUUID().toString() + suffix;
                // 5:日期目錄
                SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy/MM/dd");
                String datePath = simpleDateFormat.format(new Date());
                // 6:上傳目錄
                File targetFile = new File(uploadFolder + dir, datePath);
                // 7:如果目錄不存在,遞歸創建
                if (!targetFile.exists()) targetFile.mkdirs();
                // 8:文件上傳目錄
                File dirFileName = new File(targetFile, newFileName);
                // 9:文件上傳
                multipartFile.transferTo(dirFileName);

                // 10:路徑拼接
                String fileUrl = dir + "/" + datePath + "/" + newFileName;
                // 11:完整訪問路徑
                String linkUrl = rootPath + staticPatterPath + fileUrl;

                Map<String, Object> map = new HashMap<>();
                map.put("url", linkUrl); // url
                map.put("size", multipartFile.getSize());// 大小
                map.put("fileName", originalFilename);// 真實文件名稱
                map.put("ext", suffix);// 后綴名
                list.add(map);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        return list;
    }

測試結果也是沒毛病的~ 推薦第一種寫法

示例代碼:https://chenyu6666.lanzoui.com/inY8Owtnngd


ok~至此,關於本機的文件上傳就探討到此,后續我們將使用阿里雲oss存儲繼續學習文件上傳。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM