字节二面:GET 请求能上传图片吗?我蒙了

开发 后端
曾经遇到的面试题,觉得挺有意思,来说下我的答案及思考过程。

 [[434530]]

前言

曾经遇到的面试题,觉得挺有意思,来说下我的答案及思考过程。

首先,我们要知道的是,图片一般有两种传输方式:base64和file对象。

base64 图片

图片的base64编码想必大家都见过:

base64的本质是字符串,而GET请求的参数在url里面,所以直接把图的base64数据放到url里面,就可以实现GET请求传图片。

input输入框拿到的图是file对象,图片file对象转base64: 

  1. // img参数:file文件或者blob  
  2. const getBase64 = img => {  
  3.   return new Promise((resolve,reject) => {  
  4.     const reader = new FileReader();  
  5.     reader.onload = e => {  
  6.       resolve(e.target.result);  
  7.     };  
  8.     reader.onerror = e => reject(e);  
  9.     reader.readAsDataURL(img);  
  10.   })  

问题来了,GET请求的url长度是有限制的,不同的浏览器长度限制不一样,最长的大概是 10k 左右,根据base64的编码原理,base64图片大小比原文件大小大 1/3,所以说base64只能传一些非常小的小图,大图的base64太长会被截断。

但其实这个长度限制是浏览器给的,而不是GET请求本身,也就说,在服务端,GET请求长度理论上无限长,也就是可以传任意大小的图片。

file 对象

我们来看看这个场景: 

  1. <form action="http://localhost:8080/" method="get">  
  2.     <input type="file" name="logo">  
  3.     <input type="submit">  
  4. </form> 

选择图片,然后提交表单,能提交成功,但是接口收不到文件。请求的url会变成http://localhost:8080/?logo=xxx.png,但是不会携带图片数据。正常情况,file对象数据是放在POST请求的body里面,并且是form-data编码。

推荐一个 Spring Boot 基础教程及实战示例:https://github.com/javastacks/spring-boot-best-practice

那么GET请求能否有body体呢?

答案是可以有。

GET和POST并没有本质上的区别,他们只是HTTP协议中两种请求方式,仅仅是报文格式不同(或者说规范不同)。

做过底层开发的同事可能比较熟悉,之前我们C语言的同事和我讲,我们的HTTP请求,他们收到是这样子的:

举个栗子, 一个普通的 GET 请求,他们收到是这样的: 

  1. GET /test/?sex=man&name=zhangsan HTTP/1.1  
  2. Host: http://localhost:8080  
  3. Accept: application/json, text/plain, */*  
  4. Accept-Encoding: gzip, deflate  
  5. Accept-Language: zh-CN,zh;q=0.9  
  6. Connection: Keep-Alive 

POST 请求长这样: 

  1. POST /add HTTP/1.1  
  2. Host: http://localhost:8080  
  3. Content-Type: application/x-www-form-urlencoded  
  4. Content-Length: 40  
  5. Connection: Keep-Alive  
  6. sex=man&name=Professional 

同样,DELETE、PUT、PATCH请求,也都是这样的报文。底层解析这个报文的时候,并不关心是什么请求,所以说GET请求也可以有body体,也可以传form-data数据。

有兴趣的可以拿 postman 试一下,看看GET请求传图片,接口能不能收到图片文件:

结尾

综上所述,GET 请求是可以传图片的,但是 GET 和 POST 的规范还是要遵守的,如果有后台让你这么做,锤他就行了! 

 

责任编辑:庞桂玉 来源: java版web项目
相关推荐

2023-05-07 07:45:31

2021-02-06 09:07:58

字节跳动消息

2021-06-30 17:38:03

Trie 树字符Java

2021-03-01 11:53:15

面试伪共享CPU

2022-08-13 12:07:14

URLHTTP加密

2021-06-07 09:37:24

苹果数据开发

2023-11-27 08:57:24

GoGET

2021-03-15 11:20:46

HTTPS优化前端

2021-01-26 01:55:24

HTTPS网络协议加密

2023-06-29 08:43:44

DNS解析IP

2022-03-14 11:05:01

RocketMQRedis缓存

2022-06-02 10:54:16

BrokerRocketMQ

2022-03-30 10:10:17

字节码栈空间

2024-04-03 09:01:34

SpringTomcat容器

2022-08-18 17:44:25

HTTPS协议漏洞

2022-01-17 14:24:09

共享字节面试

2021-11-30 07:51:29

共享内存进程

2018-09-27 10:59:28

信锐技术

2022-09-13 14:42:35

Redis内存函数

2023-10-30 01:02:56

Java类类加载器双亲委派
点赞
收藏

51CTO技术栈公众号