SpringBoot2.X (十):檔案上傳

痴乙發表於2018-05-30

我們利用 SpringMVC 中的 MultipartFile 來進行檔案上傳作業
前端程式碼(因為最近一直做的是前後端分離,前端寫的有點醜,勿怪~~~):

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>檔案上傳</title>
</head>
<body>
<form enctype="multipart/form-data" method="post" action="/file/upload">
    檔案:<input type="file" name="file"/>
    姓名:<input type="text" name="name"/>
    <input type="submit" value="上傳"/>
</form>
</body>
</html>

後端實現:

package com.fxbin123.controller;

import com.alibaba.fastjson.JSONObject;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;

/**
 * Created with IntelliJ IDEA.
 * User: fxbin
 * Date: 2018/5/30
 * Time: 5:43
 * Description:
 */
@RestController
@RequestMapping("/file")
public class FileController {

    private final static String filePath = "D://data/";

    @RequestMapping("/upload")
    public JSONObject upload(@RequestParam("file") MultipartFile file, HttpServletRequest request){

        JSONObject result = new JSONObject();

        // 姓名
        String name = request.getParameter("name");
        System.out.println("姓名:" + name);

        // 檔名
        String fileName = file.getOriginalFilename();
        System.out.println("檔名: " + fileName);

        // 檔案字尾
        String suffixName = fileName.substring(fileName.lastIndexOf("."));
        System.out.println("檔案字尾名: " + suffixName);

        // 重新生成唯一檔名,用於儲存資料庫
        String newFileName = UUID.randomUUID().toString()+suffixName;
        System.out.println("新的檔名: " + newFileName);

        //建立檔案
        File dest = new File(filePath + newFileName);

        Map map = new HashMap();
        map.put("filePath", dest.getAbsolutePath());
        map.put("name", name);
        try {
            file.transferTo(dest);
            result.put("success", true);
            result.put("data", map);
            return result;
        } catch (IOException e) {
            e.printStackTrace();
        }
        return (JSONObject) result.put("success", false);
    }
}

接下來簡單測試一下:
這裡寫圖片描述

然而,,,哦啊,,,報錯了(尷尬了)。。。
這裡寫圖片描述

原來是我D 盤 沒有data 目錄,建立之,再來一次,成功,同時列印出了我們的期望值
這裡寫圖片描述
看下D盤 data 目錄,我們上傳的圖片已經靜靜的躺在了那裡~~~
這裡寫圖片描述
使用返回的檔案路徑,同樣可以檢視已經上傳的圖片
這裡寫圖片描述

當然了,在實際開發中,我們需要上傳的檔案大小做限制,這裡我們在 application.yml 中通過配置的方式 限制上傳大小為 100kb

spring:
  servlet:
    multipart:
      max-file-size: 100kb

這裡寫圖片描述

我們就上傳這張 600kb 的圖片,看看會如何。。。
這裡寫圖片描述
這裡寫圖片描述

果然,不能太囂張啊,這張圖片有點囂張,被成功的攔截了。。。瀏覽器返回的資訊告訴我們最大限制是 100kb ,與我們的期望相符,當然了,對檔案大小的限制不止這一種方法,

還可以通過 直接獲取 上傳檔案的大小, ex:

file.getSize();
# 在程式碼中對上傳的檔案大小做限制

或者在 Application 類中 註冊MultiPartConfigElement 的方式

package com.fxbin123;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.MultipartConfigFactory;
import org.springframework.context.annotation.Bean;

import javax.servlet.MultipartConfigElement;

/**
 * Created with IntelliJ IDEA.
 * User: fxbin
 * Date: 2018/5/22
 * Time: 23:06
 * Description:
 */
@SpringBootApplication
public class Application {

    public static void main(String[] args) throws Exception {
        SpringApplication.run(Application.class, args);
    }

    @Bean
    public MultipartConfigElement multipartConfigElement() {
        MultipartConfigFactory factory = new MultipartConfigFactory();
        //單個檔案最大   KB,MB 
        factory.setMaxFileSize("100KB");  
        /// 設定總上傳資料總大小  
        factory.setMaxRequestSize("1024000KB");
        return factory.createMultipartConfig();
    }

}

在此就不一一進行敘述,有興趣的朋友可自行嘗試

最後附上專案地址: https://gitee.com/fxbin123/SpringBoot2Example