使用JSON进行Base64文件上传和使用AJAX或jQuery上传的优缺点是什么?

3

我被委托编写将图片上传到远程服务器并保存这些图片到本地的功能。使用Base64传输通过JSON存储并使用Node.js实现这个功能非常容易。然而,除了已知的带宽增加30%的缺点之外,是否有理由不使用此类型的文件上传方式,而使用AJAX或其他方式呢?您可以在回答中包含这一点以使其完整。

6个回答

6
base64编码的想法是为了避免基于文本的协议中使用二进制数据。在这种情况下之外,我认为总是一个坏主意。
优点:
- 避免基于文本的协议中使用二进制数据,并且不依赖外部文件。 - 避免分隔符冲突
缺点:
- 时间和空间复杂度增加;对于空间而言,它增加了33-36%(33%由编码本身,最多3%由插入的换行符)。 - API响应负载更大/过大。 - 用户体验受到负面影响,除非调用一些懒加载。
引用:
通过在一个API响应中包含所有图像数据,应用程序必须在绘制任何屏幕内容之前接收所有数据。这意味着用户将看到屏幕上的加载状态更长时间,并且应用程序将出现迟缓,因为用户需要等待。

然而,通过使用Axios和一些懒加载器,例如react-lazyloadlazyload等,可以缓解这个问题。

该网站的开发人员可能选择通过使用神秘的URL等方式使网站看起来更加安全。然而,这并不意味着这是安全性靠模糊来保障。

如果他们的网站容易受到SQL注入攻击,并试图通过编码URL来隐藏这一点,那么这就是安全性靠模糊来保障。如果他们的网站已经很好地防范了SQL注入、XSS、CSRF等攻击,并且他们决定像那样编码URL,那么这就是纯粹的愚蠢行为。

参考资料

https://en.wikipedia.org/wiki/Base64

https://en.wikipedia.org/wiki/Delimiter#Delimiter_collision

SO: Base64编码有什么用途?

https://medium.com/snapp-mobile/dont-use-base64-encoded-images-on-mobile-13ddeac89d7c

https://css-tricks.com/probably-dont-base64-svg/

https://security.stackexchange.com/questions/46362/purpose-of-using-base64-encoded-urls

https://bunnycdn.com/blog/why-optimizing-your-images-with-base64-is-almost-always-a-bad-idea/

https://www.davidbcalhoun.com/2011/when-to-base64-encode-images-and-when-not-to/


1

数据编码

每种数据编码解码都可以用于不同的原因,带来了利益和不利之处。

例如:

  • 错误检测编码:可以检测错误,但会增加数据使用量。
  • 加密编码:将数据转换为密码,使入侵者无法破译。

有很多编码算法可以改变数据,具有某些有用性。

但是,使用

Base64编码,它将每个6位数据编码成一个字符(8位)。 3字节到4字节,但它只包括62个不同的字母数字和2个符号。

它的好处是没有特殊字符和符号

Base64目的

它使得可能通过禁止我们拥有的渠道传输任何数据

  • 特殊字符,如' " / \ ...
  • 不可打印的ASCII字符,如\0 \n \r \t \a
  • 8位ASCII代码(带有1个MSB的ASCII)

二进制文件通常包括任何数据,如果转换为ASCII,则可以是任何8位字符。

在某些协议应用程序中,只接受少量字符(带有一些符号的字母数字)的I/O接口。

由于:

  1. 防止编码注入(例如:SQL注入或任何类似编程语言语法的字符;

  2. 或者只是某些字符已经在其协议中具有意义(例如,在URI QueryString中,字符&具有意义,不能出现在任何QueryString值中)

  3. 或者输入不打算接受非字母数字值。 (例如:它应该仅接受人名

使用base64编码,你可以对任何内容进行编码,并通过任何渠道传输。
例如:
1. 你可以使用 SQL 对图像或应用程序进行编码并保存在数据库管理系统中。 2. 你可以在 URI 中包含一些二进制数据。 3. 你可以通过只接受字母数字字符作为人类聊天的协议(如 IRC 频道)发送二进制文件。

0

Base64是一种转换格式,HTTP服务器无法接受内容中的二进制数据,除非HTTP头部类型为二进制或由Web服务器定义的可接受格式。

正如您所知,JSON可以包含各种格式和信息;因此,您可以包含诸如

{
     IMG_FILENAME="HELLO",
     IMG_TYPE="IMG/JPEG", 
     DATA="~~~BASE64 ENCODED IMAGE~~~~" 
}

你可以通过AJAX或其他方法发送JSON文件。但是,正如我告诉过你的那样,HTTP服务器有各种限制,因为它必须遵守RFC2616(https://www.rfc-editor.org/rfc/rfc2616)。

简而言之,通过JSON发送可以包含各种数据。 AJAX只是一种发送方式,就像其他方式一样。


0

我在我的一个项目中使用了相同的解决方案。

唯一的问题是请求体的大小。如果你的所有图片都很小,比如几兆字节,那么应该没问题。

我的服务器是asp.net core,它的maxAllowedContentLength值是30000000,大约28.6MB。当图片大小超过这个值时,请求会因为"request body too large"错误而失败。

我认为node.js应该有类似的设置,请确保根据你的需求进行调整。

请注意,当请求大小太大时,由于网络流量的原因,请求超时的可能性也相应增加。对于来自手机的请求尤其会成为一个问题。


0

我认为使用base64是有效的。

唯一的疑问是请求的大小,但如果在前端将此base64分成几部分,则可以避免这个问题。例如,对于一个30mb的文件,您可以将每个请求分成5mb,在后端将这些部分组合在一起。这甚至有助于在网络出现问题并且某些部分损坏时进行“保持下载”。

祝好


0

Base64 可将数据转换为二进制数据的 ASCII 表示形式。它允许您将数据嵌入到文本流中,例如 JSON。Base64 会增加传输的数据大小约 33%。

multipart/form-data 是在 HTTP 请求中传输二进制数据的标准方式。它允许您为每个要传输的部分使用特定的编码/内容类型。在我看来,除非您有特定的要求或设备/SDK 功能,否则应坚持使用多部分上传。

请查看以下链接

Base64 和多部分之间有何区别?

Base64 图像上传与二进制图像上传之间的差异?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接