面试:GET 请求能上传图片吗,已解决
转公众号: java大后端
前言
曾经遇到的面试题,觉得挺有意思,来说下我的答案及思考过程。
首先,我们要知道的是,图片一般有两种传输方式:base64
和 file
对象。
base64 图片
图片的base64
编码想必大家都见过:
base64
的本质是字符串,而 GET
请求的参数在 url
里面,所以直接把图的 base64
数据放到 url
里面,就可以实现 GET
请求传图片。
input
输入框拿到的图是 file
对象,图片 file
对象转 base64
:
// img参数:file文件或者blob const getBase64 = img => { return new Promise((resolve,reject) => { const reader = new FileReader(); 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
请求长度理论上无限长,也就是可以传任意大小的图片。
file 对象
我们来看看这个场景:
<form action="http://localhost:8080/" method="get"> <input type="file" name="logo"> <input type="submit"> </form>
选择图片,然后提交表单,能提交成功,但是接口收不到文件。请求的 url
会变成 http://localhost:8080/?logo=xxx.png
,但是不会携带图片数据。正常情况,file
对象数据是放在POST
请求的 body
里面,并且是 form-data
编码。
那么 GET
请求能否有 body
体呢?
答案是可以有。
GET
和 POST
并没有本质上的区别,他们只是 HTTP
协议中两种请求方式,仅仅是报文格式不同(或者说规范不同)。
做过底层开发的同事可能比较熟悉,之前我们C语言的同事和我讲,我们的 HTTP
请求,他们收到是这样子的:
举个栗子, 一个普通的 GET 请求,他们收到是这样的:
GET /test/?sex=man&name=zhangsan HTTP/1.1 Host: http://localhost:8080 Accept: application/json, text/plain, */* Accept-Encoding: gzip, deflate Accept-Language: zh-CN,zh;q=0.9 Connection: Keep-Alive
POST 请求长这样:
POST /add HTTP/1.1 Host: http://localhost:8080 Content-Type: application/x-www-form-urlencoded Content-Length: 40 Connection: Keep-Alive sex=man&name=Professional
同样,DELETE
、PUT
、PATCH
请求,也都是这样的报文。底层解析这个报文的时候,并不关心是什么请求,所以说 GET
请求也可以有body
体,也可以传 form-data
数据。
有兴趣的可以拿 postman 试一下,看看 GET
请求传图片,接口能不能收到图片文件:
结尾
综上所述,GET 请求是可以传图片的,但是 GET 和 POST 的规范还是要遵守的,如果有后台让你这么做,锤他就行了!
面试:GET 请求能上传图片吗,已解决相关推荐
- 【已解决】(uni-app)IOS 端 H5 应用无法发起请求,请求状态码为0,错误描述为request:fail
[已解决](uni-app)IOS 端 H5 应用无法发起请求,请求状态码为0,错误描述为request:fail 目录 [已解决](uni-app)IOS 端 H5 应用无法发起请求,请求状态码为0 ...
- 已解决 0x0000XXXX (ucrtbase.dll) (XXX.exe 中)处有未经处理的异常: 请求了严重的程序退出。
已解决!ucrtbase.dll, XXX.exe 中处有未经处理的异常: 请求了严重的程序退出. 问题描述 解决方法 问题描述 最近在编译IFC++工程,发现在运行的时候VS2019弹出了相关错误提 ...
- 安全狗服务器自动重启,关于解决安全狗“您的请求过于频繁,已被管理员设置拦截”方法...
他们在使用安全狗后访问自己的网站或者访客在访问其他人的网站时经常会弹出"您的请求过于频繁,已被管理员设置拦截"的页面,如图所示 首先我们应该先看一下在防护日志中安全狗有何记录拦截信 ...
- (已解决)关键词爬取百度搜索结果,返回百度安全验证,网络不给力,请稍后重试,无法请求到正确数据的问题(2023最新)
已解决,使用关键词进行百度搜索,然后爬取搜索结果,请求数据后,返回的是百度安全验证,网络不给力,请稍后重试.无法请求到正确数据.且尝试在header中增加Accept参数还是不行. 一.问题产生的现象 ...
- 已解决requests.exceptions.ConnectTimeout: HTTPConnectionPool(host=‘123.96.1.95‘, port=30090): Max retri
已解决requests.exceptions.ConnectTimeout: HTTPConnectionPool(host='123.96.1.95', port=30090): Max retri ...
- 已解决UserWarning: Manipulating `w3c` setting can have unintended consequences.
已解决UserWarning: Manipulating w3c setting can have unintended consequences. warnings.warn(UserWarning ...
- 已解决Python调用免费申请的百度图形识别接口案例
已解决Python调用免费申请的百度图形识别接口{'error_code': 18, 'error_msg': 'Open api qps request limit reached'} 文章目录 报 ...
- 已解决urllib模块设置代理ip
已解决urllib模块设置代理ip 文章目录 报错代码 报错翻译 报错原因 解决方法 千人全栈VIP答疑群联系博主帮忙解决报错 报错代码 最近用urllib编写了一个简单的爬虫下载网上文件的代码,刚运 ...
- 已解决urllib.request.urlretrieve下载文件报错403
已解决(python使用urlopen/urlretrieve下载文件时出现403 forbidden)urllib.error.HTTPError: HTTP Error 403: Forbidde ...
最新文章
- LiveVideoStack线上分享第三季(六):深度学习与视频编码
- 解决由于没有办理权限导致的403,权限不足
- WEB安全基础-Javascrp相关知识点之DOM
- php7 mysql json 小程序_微信小程序JSON数组递交PHP服务端解析处理
- 求解偏微分方程开源有限元软件deal.II学习--Step 48
- C# 随机数 Radom 循环生成同一的数字
- SpringBoot整合Magic-Api
- LTE/LTE advanced——UMTS 长期演进理论与实践——控制面(3)
- conda 查看现有虚拟环境 - 删除现有虚拟环境
- cli命令行配置路由器_Cisco路由CLI基础命令
- 数据库公共字段自动填充
- C语言函数的简单书写规范和调用
- 56-OvR 和 OvO
- 18个最佳代码编辑器/IDE推荐
- 一款轻量级的markdown编辑器
- 计算机软考高级职称论文,关于计算机软考,这里可以解决你所有的问题
- multisim安装后无法连接数据库_计算机重装系统时遭遇错误意外重启后无法安装,这是什么原因?...
- 【C语言】求素数的三种方案
- 服务器Apache配置以及改变工作目录
- 那些年被你亲手敲烂过的键盘