作者:沈墨_\链接:https://juejin.cn/post/686025...前言遇到的面试题挺有意思的。分享一下我的答案和思考过程。首先,我们需要知道的是,图片的传输方式一般有两种:base64和文件对象。base64图片图片的base64编码想必大家都看过:base64的本质是字符串,GET请求的参数在url中,所以直接把图片的base64数据放在url中,你可以实现GET请求传输图片。input输入框获取的图片是一个文件对象,图片文件对象转成base64//img参数:文件文件或blobconstgetBase64=img=>{returnnewPromise((resolve,reject)=>{constreader=newFileReader();reader.onload=e=>{resolve(e.target.result);};reader.onerror=e=>reject(e);reader.readAsDataURL(img);})}这里问题来了,GET请求的url长度是有限制的,不同的浏览器有不同的长度限制,最长的是10k左右,根据base64编码原理,base64图片大小比原文件大1/3,所以base64可以只传一些非常小的图片,大图片的base64过长会被截断。但实际上这个长度限制是浏览器给定的,而不是GET请求本身。也就是说,在服务器端,GET请求长度理论上是无限大的,即可以传输任意大小的图片。文件对象让我们来看看这个场景:选择图片,然后提交表单,可以提交成功,但是界面收不到文件。请求的url会变成http://localhost:8080/?logo=xxx.png,但是不会携带图片数据。通常,文件对象数据放在POST请求的主体中,并编码为表单数据。那么GET请求可以有body吗?答案是肯定的。GET和POST没有本质区别。它们只是HTTP协议中的两种请求方式,只是报文格式不同(或者说规范不同)。做过底层开发的同事可能不陌生。之前我们C语言的同事跟我说,我们的HTTP请求,他们是这样接收的:比如一个普通的GET请求,他们是这样接收的:GET/test/?sex=man&name=zhangsanHTTP/1.1Host:http://localhost:8080Accept:application/json,text/plain,*/*Accept-Encoding:gzip,deflateAccept-Language:zh-CN,zh;q=0.9Connection:Keep-AlivePOST请求如下所示:POST/addHTTP/1.1Host:http://localhost:8080Content-Type:application/x-www-form-urlencodedContent-Length:40Connection:Keep-Alivesex=man&name=同样,对于Professional,DELETE、PUT和PATCH请求都是此类消息。底层在解析这个消息的时候,并不关心是什么请求,所以GET请求也可以有body,也可以传递form-data数据。有兴趣的可以用postman试一下,看看发送GET请求时接口是否可以接收到图片文件:综上所述,GET请求可以发送图片,但是必须遵守GET和POST的规范。有一个后端可以让你做到这一点,就打他吧!近期热点文章推荐:1.1000+Java面试题及答案(2021最新版)2.别满屏if/else,试试策略模式,好香!!3.操!Java中xx≠null的新语法是什么?4、SpringBoot2.5发布,深色模式太炸了!5.《Java开发手册(嵩山版)》最新发布,赶快下载吧!感觉不错,别忘了点赞+转发!