Springboot實現上傳文件接口,使用python的requests進行組裝報文上傳文件的方法


  記錄瞬間

近段時間使用Springboot實現了文件的上傳服務,但是在使用python的requests進行post上傳時,總是報錯。

比如:

1、Current request is not a multipart request

2、Required request part 'fileName' is not present

3、MissingServletRequestPartException: Required request part 'fileName' is not present

4、the request was rejected because no multipart boundary was found

 

后來進過多次查找,終於找到一個辦法,將此問題解決。

 

// java實現的上傳接口

    /**
     * 上傳文件
     * @param file
     * @return
     */
    @RequestMapping(value = "/uploadFile", method = RequestMethod.POST , consumes = "multipart/form-data")
    @ResponseBody
    public ResultData uploadFile(@RequestParam("fileName") MultipartFile file, @RequestParam("filePath") String zipPath) {
        String msg = "AIOps, Always Online! Always in!";
        //判斷文件是否為空
        if (file.isEmpty()) {
            return new ResultData(false, msg, "失敗了");
        }
        String fileName = file.getOriginalFilename(); // 傳入的文件名
        String filePath = getOsPath();                // 獲取本地基本路徑
        String path = filePath + "/" + fileName;
        System.out.println(fileName);
        System.out.println(zipPath);
        File dest = new File(path);
        //判斷文件是否已經存在
        if (dest.exists()) {
            return new ResultData(false, msg, "失敗了");
        }
        //判斷文件父目錄是否存在
        if (!dest.getParentFile().exists()) {
            dest.getParentFile().mkdir();
        }
        try {
            file.transferTo(dest);                  // 保存文件
        } catch (IOException e) {
            return new ResultData(false, msg, "失敗了");
        }
        return new ResultData(true, msg, "成功了");
    }
    /**
     * 獲取操作系統的基本路徑
     */
    private String getOsPath(){
        String osPath = "./";
        if (System.getProperty("os.name").contains("Windows")) {
            osPath = config.getWindows_basedir();
        } else if (System.getProperty("os.name").contains("Linux")) {
            osPath = config.getLinux_basedir();
        } else {
            LOG.info("Unknown System..." + System.getProperty("os.name"));
        }
        return  osPath;
    }

 

 

 

使用python進行連接的代碼如下:

 

from urllib3 import encode_multipart_formdata
import requests


data = {
    "filePath": "path/for/test"
}
header = {}
data['fileName'] = ("fileName", open(r"D:\path\to\file", 'rb').read())
encode_data = encode_multipart_formdata(data)
data = encode_data[0]
header['Content-Type'] = encode_data[1]
result = requests.post("http://localhost:8080/uploadFile", headers=header, data=data)

 

 

 

可以正常返回。

 

當然了,上傳的過程中,也有可能存在服務器端報錯的問題。

 

org.apache.tomcat.util.http.fileupload.FileUploadBase$FileSizeLimitExceededException: The field file exceeds its maximum permitted size of 1048576 bytes.

 

說明在執行的過程中,存在上傳文件的大小限制,我們需要在 .properties文件中進行修改

 

Spring Boot的官方文檔中有說明,原文如下

65.5 Handling Multipart File Uploads
Spring Boot embraces the Servlet 3 javax.servlet.http.Part API to support uploading files. By default Spring Boot configures Spring MVC with a maximum file of 1Mb per file and a maximum of 10Mb of file data in a single request. You may override these values, as well as the location to which intermediate data is stored (e.g., to the /tmp directory) and the threshold past which data is flushed to disk by using the properties exposed in the MultipartProperties class. If you want to specify that files be unlimited, for example, set the multipart.maxFileSize property to -1.The multipart support is helpful when you want to receive multipart encoded file data as a @RequestParam-annotated parameter of type MultipartFile in a Spring MVC controller handler method.

文檔說明表示,每個文件的配置最大為1Mb,單次請求的文件的總數不能大於10Mb。要更改這個默認值需要在配置文件(如application.properties)中加入兩個配置

multipart.maxFileSize = 10Mb
multipart.maxRequestSize=100Mb
multipart.maxFileSize=10Mb是設置單個文件的大小, multipart.maxRequestSize=100Mb是設置單次請求的文件的總大小

如果是想要不限制文件上傳的大小,那么就把兩個值都設置為-1就行啦

如果有誤,請查看文末提示官方文檔哈

Spring Boot1.4版本后配置更改為:

spring.http.multipart.maxFileSize = 10Mb
spring.http.multipart.maxRequestSize=100Mb


Spring Boot2.0之后的版本配置修改為:

spring.servlet.multipart.max-file-size = 10MB
spring.servlet.multipart.max-request-size=100MB

 

=============底線=============

 


免責聲明!

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



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