zoukankan      html  css  js  c++  java
  • 通过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();
        }

    加粗标红为希望上传的大小限制。

  • 相关阅读:
    bash 笔记
    lvs: linux virtual server
    学习html第一天
    学习c语言的第14天
    c语言学习的第13天2
    c语言学习的第13天1
    c语言学习的第12天
    c语言学习的第11天 指针
    移动端点击延迟300毫秒----FastClick用法
    H5移动端复制功能实现
  • 原文地址:https://www.cnblogs.com/Faquir/p/9230855.html
Copyright © 2011-2022 走看看