通過form表單文件上傳,后台獲取不到文件


今天在工作中遇到了后台獲取不到文件的問題,概述如下:

我用Java寫了一個文件上傳的方法,並作為接口提供給外部使用,Controller中代碼如下:

/**
     * 文件上傳
     * @since 2018年5月22日14:21:50
     * @return
     */
    @ApiOperation(value="文件上傳", notes = "文件上傳接口")
    @RequestMapping(value = "/upload", consumes = "multipart/form-data;charset=utf-8", produces = "text/plain;charset=utf-8", method = RequestMethod.POST)
    public @ResponseBody ResponseEntity<String> upload(HttpServletRequest request) {
        byte[] filedata = null;
        String fileHash = "";

        HashMap<String, String> resultMap = new HashMap<String, String>();
        if (request instanceof MultipartHttpServletRequest) {
            MultipartHttpServletRequest multipartHttpServletRequest = (MultipartHttpServletRequest) request;
            List<MultipartFile> files = multipartHttpServletRequest.getFiles("file");
            if(files.size() > 0) {
                for (MultipartFile file : files) {
                    /***/
                }
                resultMap.put("rtnCod", "0000");
                resultMap.put("errMsg", null);
                resultMap.put("fileHash", fileHash);
            }else{
                resultMap.put("rtnCod", "FAILED");
                resultMap.put("errMsg", "No Files");
                resultMap.put("fileHash", fileHash);
            }
        }
        return ResponseEntity.ok(JSONUtils.toJSONString(resultMap));
    }

在postman中調用的時候沒問題,但是當使用程序調用時卻獲取不到文件,

List<MultipartFile> files = multipartHttpServletRequest.getFiles("file");

這里files無法得到內容。

試了很多方法,

修改調用段的"Content-Type", 修改upload方法中入參的類型為MultipartFile,等等,就是沒文件。最后在調試的過程中發現request都接收到了文件信息,但就是files的size為0.

最后在同事的幫助下才知道還是下面這一行的問題,確切說應該是它和調用者共同的問題。

List<MultipartFile> files = multipartHttpServletRequest.getFiles("file");

這里getFiles方法中的參數寫成了固定的"file",而調用方傳入的名稱是不確定的,因此出現了不一致的情況,導致無法獲取文件。

以html通過js調用為例,html代碼如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script type="text/javascript" src="upload.js"></script>
    <script type="text/javascript" src="jquery-1.8.2.min.js"></script>
</head>
<body>
<form enctype = "multipart/form-data;charset=utf-8" name="upform" action="" method="POST">
    <input type ="file" name="file" id="file"/><br/>
    備注:<input type="text" name="mydata" id="mydata"/><br/>
    <input type="button" value="確定" onclick="upload()"/><br/>
</form>
</body>
</html>

js代碼如下:

function upload() {
    mydata = document.getElementById("file").files[0];
    formData = new FormData();
    formData.append("file", mydata);
    $.ajax({
        // contentType:"multipart/form-data",
        url:"http://xxx/file/upload",
        type:"POST",
        data:formData,
        dataType:"text",
        processData: false, // 告訴jQuery不要去處理發送的數據
        contentType: false, // 告訴jQuery不要去設置Content-Type請求頭
        success: function(result){
            alert(result);
        }
    });
}

如代碼中突出的部分所示,這個名稱應該與上面后台getFiles方法中傳入的參數保持一致,否則就無法順利獲得form表單上傳的文件。

 

總結,在一開始就沒搞明白getFiles方法中參數"file"的意義,在調試的過程中也對此產生了好奇,但就是沒有深入跟進,導致做了很久的無用功,嘗試了很多無意義的方法,需要注意。

 

Ps: 我使用的框架是spring boot,里面包含了文件上傳的jar包,默認的上傳文件大小是1048576 bytes, 每次文件超過此大小時,后台就會報錯:

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

解決方法是主程序Application.java中加入以下代碼,

/**
 * 文件上傳配置
     * @return
     */
    @Bean
    public MultipartConfigElement multipartConfigElement() {
        MultipartConfigFactory factory = new MultipartConfigFactory();
        //文件最大
        factory.setMaxFileSize("10240KB"); //KB,MB
        /// 設置總上傳數據總大小
        factory.setMaxRequestSize("102400KB");
        return factory.createMultipartConfig();
    }

加粗標紅為希望上傳的大小限制。


免責聲明!

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



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