阿里二面:GET 请求能传图片吗?
欢迎关注方志朋的博客,回复”666“获面试宝典
从一道面试题说起:GET 请求能传图片吗?
「前言」
曾经遇到的面试题,觉得挺有意思,来说下我的答案及思考过程。
首先,我们要知道的是,图片一般有两种传输方式: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-Alivesex=man&name=Professional
同样,DELETE
、PUT
、PATCH
请求,也都是这样的报文。底层解析这个报文的时候,并不关心是什么请求,所以说 GET
请求也可以有body
体,也可以传 form-data
数据。有兴趣的可以拿 postman(我用的版本是 v7.30.1) 试一下,看看 GET
请求传图片,接口能不能收到图片文件:
GET 请求能不能带 body 这个事是由 HTTP 协议来定义的
。所谓协议就是大家共同遵守的一套规则,你不遵守某一规则有时候确实不会有大问题,但是其行为表现是什么就不得而知了。协议带来规范化,规范化带来高效。事实是 HTTP 1.1 的 RFC 文档里没有禁止 GET 请求带 body ,但是也没有定义 GET 请求 body 的语义。
参见: tools.ietf.org
。
❝
A payload within a GET request message has no defined semantics; sending a payload body on a GET request might cause some existing implementations to reject the request.
❞
总结
作为面试题的话,本题大概有两个考点:
二进制图片序列化 base64;
特定场景的 url 长度限制。
部分 http 协议知识。
或者说,真要 get 传图片作为方案的话,需要打通上面两个关键技术问题。面试现场也可以再加一些Blob、TypedArray、图片压缩方案之类的。
原文地址:https://juejin.im/post/6860253625030017031
热门内容:
妙用Java 8中的 Function接口 消灭if...else(非常新颖的写法)
阿里二面:现针对一个请求量10000次/s的秒杀系统,说说你的优化思路
阿里3大编程语言,Java没上榜!
在部队当程序员是什么体验?
mybatis-plus团队新作:mybatis-mate 轻松搞定数据权限
最近面试BAT,整理一份面试资料《Java面试BAT通关手册》,覆盖了Java核心技术、JVM、Java并发、SSM、微服务、数据库、数据结构等等。
获取方式:点“在看”,关注公众号并回复 666 领取,更多内容陆续奉上。
明天见(。・ω・。)ノ♡
阿里二面:GET 请求能传图片吗?相关推荐
- GET 请求能传图片吗?
程序员的成长之路 互联网/程序员/技术/资料共享 关注 阅读本文大概需要 2.4 分钟. 作者:沉末 原文地址:https://juejin.im/post/6860253625030017031 前 ...
- 本地图片转base64_从一道面试题说起:GET 请求能传图片吗?
前言 忘了在哪里看到的这个题目,觉得挺有意思,来说下我的答案及思考过程. 首先,我们要知道的是,图片一般有两种传输方式:base64 和 file 对象. base64 图片 图片的base64编码想 ...
- base64转图片_从一道面试题说起:GET 请求能传图片吗?
前言 忘了在哪里看到的这个题目,觉得挺有意思,来说下我的答案及思考过程. 首先,我们要知道的是,图片一般有两种传输方式:base64 和 file 对象. base64 图片 图片的base64编码想 ...
- JAVA实现生成原生二维码并上传至阿里云
JAVA生成二维码并上传至阿里云 pom依赖 <dependency><groupId>com.google.zxing</groupId><artifact ...
- Spring boot上传文件(图片)到阿里云OSS(直接上传到应用服务器)
Spring boot上传文件(图片)到阿里云OSS(直接上传到应用服务器) 主要思路 上传图片的思路有两种: 第一种是上传到应用服务器,再由应用服务器上传到OSS.这种适合上传的文件较小,较为简单, ...
- 阿里云 OSS SDK :上传的图片直接访问变成下载问题解决
文章目录 阿里云 OSS SDK :上传的图片直接访问变成下载问题解决 1.产生原因 2.解决方案 阿里云 OSS SDK :上传的图片直接访问变成下载问题解决 1.产生原因 上传的文件,未指定文件访 ...
- Nginx的安装基础配置(windows、linux)以及搭建图片服务器(windows、阿里云),文件上传
Nginx的安装基础配置(windows.linux)以及搭建图片服务器(windows.阿里云),文件上传 本文目录 文章目录 Nginx的安装基础配置(windows.linux)以及搭建图片服务 ...
- Android-上传图片(二)_HttpClient
上篇博文中记录了使用HttpURLConnection模拟HTTP请求上传文件到服务端 Android-上传图片(-)_HttpURLConnection 本篇博文中将使用Apache HttpCli ...
- 使用PicGo+阿里云OSS实现md文档图片上传
使用PicGo+阿里云OSS实现md文档图片上传 这次给大家带来的是PicG0+阿里云Oss+typora的图床环境搭建,帮助大家提高工作效率+写博客速度! 1.typora安装 给大家一个链接:ty ...
最新文章
- 轮询 长轮询 websocket
- Cocos2d-x 生成真正的随机数
- 函数exit()详解:参数EXIT_FAILURE(是1),EXIT_SUCCESS(是0)
- xgboost防止过拟合
- 巴塞尔新资本协议_《巴塞尔公约》修订!进口再生颗粒或对中国产生巨大冲击...
- ASP.NET Core 实现带认证功能的Web代理服务器
- CentOS 7下宿主机使用virsh console访问KVM的设置
- hadoop MultipleInputs fails with ClassCastException (get fileName)
- 递增输出链表结点,删除重复结点
- 对象 复制构造函数
- HDU2050 由直线分割平面推广到折线分割平面
- CSAPP,拆弹到一点!!!
- java nio 大文件_java nio 超大文件的读写
- 如何保证服装ERP项目成功施行
- hp服务器3c认证证书,戴尔 Dell PowerEdge R720 服务器3C认证证书,节能认证证书
- 林赛登《花花公子》后桃花旺 与神秘男车场约会_0
- 不同vlan间通讯单臂路由和三层交换机
- 需要一个自习室系统,包括收费、灯控、会员管理、微信及前端订座、一卡通终端,会做的私信我,有偿。
- Excel使用VBA自动调整插入图片大小到单元格
- 【Adobe Creative Cloud】
热门文章
- java io 缓冲流_记忆系列-Java IO的缓存输入输出流(高效流)
- 问题二:相关性怎么引入?
- sqlserver可将字符转成数字再进行sum,如果varchar类型中存放的都是数字
- nodejs高版本转低版本
- asp.net mvc jqgrid 同一个页面查询不同的表,jqgrid显示不同表的表头和数据并且分页...
- DB天气app冲刺二阶段第十一天(完结)
- Java Socket发送与接收HTTP消息简单实现
- 没听说过这些,就不要说你懂并发了,three。
- socket 服务器浏览器与服务器客户端实例
- jquery实现心算练习