乐趣区

关于java:面试官GET-请求能上传图片吗我蒙了

作者:沉末_\
链接:https://juejin.cn/post/686025…

前言

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

首先,咱们要晓得的是,图片个别有两种传输方式:base64file对象。

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 体呢?

答案是能够有。

GETPOST 并没有实质上的区别,他们只是 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

同样,DELETEPUTPATCH 申请,也都是这样的报文。底层解析这个报文的时候,并不关怀是什么申请,所以说 GET申请也能够有body 体,也能够传 form-data 数据。有趣味的能够拿 postman 试一下,看看 GET 申请传图片,接口能不能收到图片文件:

结尾

综上所述,GET 申请是能够传图片的,然而 GET 和 POST 的标准还是要恪守的,如果有后盾让你这么做,锤他就行了!

近期热文举荐:

1.1,000+ 道 Java 面试题及答案整顿(2021 最新版)

2. 别在再满屏的 if/ else 了,试试策略模式,真香!!

3. 卧槽!Java 中的 xx ≠ null 是什么新语法?

4.Spring Boot 2.5 重磅公布,光明模式太炸了!

5.《Java 开发手册(嵩山版)》最新公布,速速下载!

感觉不错,别忘了顺手点赞 + 转发哦!

退出移动版