SSM 前端使用AJAX方式,fromdata文件格式上传二进制流文件

今天在上课的时候,遇到了一个比较坑的问题,有个学生拿来了她的代码,让我给她看看为什么传值传不过来。

首先,前端是这样的:

html 复制代码
function upload(){
    var formData = new FormData();
    formData.append('images', $('#previewImg')[0].files[0]);
    var id1=$("input[name='id']").val()
    formData.append('id', id1);
    $.ajax({
        type:"post",
        processData: false,
        contentType: false,
        url:"uploadImage",
        data:formData,
        success:function(data){
        }
    });
}

后端是这样的:

java 复制代码
@PostMapping("/uploadImage")
    public Map uploadImage(Integer id,MultipartFile images,HttpSession session){
//        System.out.println(id);
//        System.out.println(images);
        }
    }

然后上传文件的配置器是这样的:

xml 复制代码
<bean id="CommonsMultipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="defaultEncoding" value="utf-8"/>
<property name="maxUploadSize" value="1048675000"/>
<property name="maxUploadSizePerFile" value="1048675000"/>
</bean>

她遇到的第一个问题是,后端这里接受值的时候,接受到的id和文件都是null,然后再后续的使用中报空指针了。

看起来就是一个很简单的空指针问题,我拿来查的时候,先看了一下她这边的前段,开始我没有注意到是使用的fromdata,我以为是普通的json传输,而且在network中也很明显能看到请求头和带的参数。

后端可以报空指针,说明后端的代码也进去了,说明请求头也没问题。

所以我觉得问题原因可能出在请求头接受值的地方(事实证明,老中医的直觉是对的)

所以我把她的后端代码头做了修改。:

复制代码
public Map uploadImage(HttpServletRequest request,HttpSession session){

用HttpServletRequest 来接受试试(这时候我还没注意到fromdata)然后发现,在req中也获取不到id,我有点麻了,我觉得可能是写法问题,导致这个数据不在req里面,我再换个写法:

复制代码
    public Map uploadImage(@RequestParam Integer id,@RequestParam MultipartFile images,HttpSession session){

可能是我对HttpServletRequest 忘记的多,找不到值在哪儿,我直接用注解去取值看看,结果发现还是null。我当时就无语了,这他妈的。

然后我就又回头去看前段,既然这里折腾半天没效果,不如换个阵地。之前前端传后端没见过二进制的文件流啊,是不是因为这玩意的原因?我去前段把她这里set文件的地方给她注掉了,我心想,这不就变成了一个普通的ajax了么,这不应该有问题吧。

然后我就去后端看,上面的三板斧又转了一圈,还不行。我真是见了鬼了。

然后学生和我说,老师是不是fromdata的问题。

我一看,这里怎么还不一样呢,我以为这里就是个普通的json。

完了又看了俩眼这个fromdata的用法,很简单啊,前段传值,后端接收,没毛病啊。这还有什么问题不成?

搜了一下fromdata使用的时候注意事项,有文章说要加个注解@MultipartConfig,但是我试过了,发现还是null,这怎么可能啊!我要颜面扫地了。

这个时候这个问题已经看了接近2个小时了,这个时候学生吐槽说,一般这种一看看一天的问题,八成是什么小问题,不知道哪儿写错了。

我也同意这种想法,于是,我的目光又回到了后端的接受请求的地方:

复制代码
public Map uploadImage(Integer id,MultipartFile images,HttpSession session){

她这里前端fromdata设置值的时候,先塞的file,后塞的id,会不会是这里接受参数的顺序有影响?

然后我把这句改了一下:

复制代码
  public Map uploadImage(MultipartFile images,Integer id,HttpSession session){

对,没错,我调换了俩个参数的位置试了一下(死马当活马医了)

然后,然后,然后这个问题就解决了,他的报错终于跳到下一步了!!!!

调换了参数位置以后,出现了新的报错,说她没有配置文件解析器,但是她这里是有配置MultipartFilte上传文件解析器的,然后这个问题比较简单,看了一下,解析器的id不对。应该是:

xml 复制代码
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="defaultEncoding" value="utf-8"/>
<property name="maxUploadSize" value="1048675000"/>
<property name="maxUploadSizePerFile" value="1048675000"/>
</bean>

一下午这就过去了,看了一个问题看了快2个半小时,所以必须写个文章记录一下。

相关推荐
6190083361 分钟前
linux 安装jdk
java·linux·运维
懂得节能嘛.4 分钟前
【动态配置中心】Java+Redis构建动态配置中心
java·开发语言·redis
专注于大数据技术栈5 分钟前
Java中JDK、JRE、JVM概念
java·开发语言·jvm
YuanlongWang9 分钟前
C# 基础——值类型与引用类型的本质区别
java·jvm·c#
Kay_Liang33 分钟前
大语言模型如何精准调用函数—— Function Calling 系统笔记
java·大数据·spring boot·笔记·ai·langchain·tools
自由的疯1 小时前
Java 如何学习Docker
java·后端·架构
自由的疯1 小时前
Java Docker本地部署
java·后端·架构
007php0071 小时前
猿辅导Java面试真实经历与深度总结(二)
java·开发语言·python·计算机网络·面试·职场和发展·golang
摇滚侠1 小时前
Spring Boot 3零基础教程,WEB 开发 内容协商机制 笔记34
java·spring boot·笔记·缓存
一勺菠萝丶1 小时前
在 macOS 上用 Docker 为 Java 后端 & 常见开发需求搭建完整服务(详尽教程)
java·macos·docker