如果文件直接用 base64 编码传,会怎么样

2022-10-09 17:21:30 +08:00
 frank1256

修改一个上传文件的接口给同事,本能的就使用 form-data 。 原本是没有上传文件的需求,content-type 是 json ,现在我改成 form ,分 2 个 key ,一个是 attachments ,一个是 req ,req 是原来 json 的字符串。

同事说直接让我还用 json ,并且在它直接将文件转 base64. 跟图片一样的意思。

他说附件不大,我觉得这样有隐患,该怎么说呢,我认为我毕竟是接口,万一给我传个 500M 的字符串啥的,这 500M 我不就全部要吃到内存里。而通过 multiple/form-data 的话,应该是从 io 流里读的,不会一次性吃 500M 内存。

问下大佬们是这样的吗?

6444 次点击
所在节点    程序员
36 条回复
binux
2022-10-10 01:55:41 +08:00
你又不是后端,他爆内存和你有什么关系?
如果和你有关系,你帮他改成 form 不就完了。
如果和你没有关系,你凭什么指手画脚?
dangyuluo
2022-10-10 05:30:14 +08:00
你想一下,原本一个字节可以表示 0-255 这 256 种不同的数据,用 base64 编码之后,一个字节就只能有 65 种可能了,纯属是浪费时间空间
hb751968840
2022-10-10 08:29:43 +08:00
上传就是 form-data ,或者 PUT ,其他都是乱搞
zilongzixue
2022-10-10 08:42:36 +08:00
这不是扯淡吗,改成 form-data 又不难,一个注解就完事了
echo1937
2022-10-10 08:50:47 +08:00
当然可以啊,以前有个 Markdown 的编辑器,你粘贴图片的时候,他就是把图片转码成 Base64 附在 Markdown 文件的末尾。
lcy630409
2022-10-10 08:59:04 +08:00
一般有一个专门上传文件的接口和函数,原 json 参数传文件名即可,接口内 代码使用文件函数 转移文件到最终存放地,临时文件夹 定期清空
lakehylia
2022-10-10 09:09:58 +08:00
文件太大还是改接口吧,搞个 v2 接口
Songxwn
2022-10-10 09:11:05 +08:00
企业微信的微盘就是,第三方只能用 base64 上传
DinnyXu
2022-10-10 09:21:12 +08:00
现在不都是用 url 后台解析吗? 前台将文件上传到 OSS 获得 url ,传输给后台一个 url ,后台自己解析 url 内容不就可以了吗,这不更快?
nothingistrue
2022-10-10 09:23:29 +08:00
如果单看编程,base64 编码进 json 里面,省事的不光前端,也有后端,而且后端省事的更多。这个的问题是,随着文件的增大,接口的处理时间、服务器的并发能能力、网关、日志等多处地方的性能都会收到影响,而且通常影响程度至少是指数级。这东西是要在编程省事和性能优化之间做权衡的,做这个权衡的,应该是架构师或者有过经验的人,不是是当事开发前后端双方。
seth19960929
2022-10-10 10:33:07 +08:00
好的做法就是你前端直传文件就可以, 然后把文件 URL 和你 req 提交给后端
unco020511
2022-10-11 10:17:50 +08:00
你们没有业务无关的存储服务吗,业务接口一般都不关注文件存储的,只关心 url
MineDog
2022-10-11 10:22:56 +08:00
@dangyuluo #22 是这么算的?
dangyuluo
2022-10-11 14:30:20 +08:00
@MineDog 如果是错误的话,请教正确的计算
MineDog
2022-10-11 14:47:35 +08:00
@dangyuluo #34 我的问题,确实是浪费了 2bit 的空间
MineDog
2022-10-11 14:52:40 +08:00
@dangyuluo #34 不过计算方式是原本 3*8=24bit 的数据需要 4*6(base64 字符,只表示 6bit 但实际还是占用还是 8bit )表示,相当于浪费了 2bit 的空间

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/885573

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX