我是靠谱客的博主 靓丽母鸡,最近开发中收集的这篇文章主要介绍GET 请求能传图片吗?Part1前言Part2base64 图片Part3file 对象Part4结尾,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

点击上方关注 “终端研发部

设为“星标”,和你一起掌握更多数据库知识
作者: 沉末_
来源: juejin.cn/post/6860253625030017031

Part1前言

忘了在哪里看到的这个题目,觉得挺有意思,来说下我的答案及思考过程。

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

Part2base64 图片

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

ad11ed7a2ebd57f4d3a71b937610c1da.png

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 请求长度理论上无限长,也就是可以传任意大小的图片。

Part3file 对象

我们来看看这个场景:

<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 请求,他们收到是这样子的:

aa500210188206e2a4bd88f4e937b67d.png

举个栗子, 一个普通的 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 请求传图片,接口能不能收到图片文件:

e83342289cf9f7e5d8c8d047e2761907.png

Part4结尾

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

6d8c63926e142d61329eb262898a5ac5.gif

BAT等大厂Java面试经验总结

805edee93266fe3eb10ad64c773847db.png

想获取 Java大厂面试题学习资料

扫下方二维码回复「BAT」就好了

回复 【加群】获取github掘金交流群
回复 【电子书】获取2020电子书教程
回复 【C】获取全套C语言学习知识手册
回复 【Java】获取java相关的视频教程和资料
回复 【爬虫】获取SpringCloud相关多的学习资料
回复 【Python】即可获得Python基础到进阶的学习教程
回复 【idea破解】即可获得intellij idea相关的破解教程
关注我gitHub掘金,每天发掘一篇好项目,学习技术不迷路!
如果喜欢就给个“在看”

最后

以上就是靓丽母鸡为你收集整理的GET 请求能传图片吗?Part1前言Part2base64 图片Part3file 对象Part4结尾的全部内容,希望文章能够帮你解决GET 请求能传图片吗?Part1前言Part2base64 图片Part3file 对象Part4结尾所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(47)

评论列表共有 0 条评论

立即
投稿
返回
顶部