我被委托编写将图片上传到远程服务器并保存这些图片到本地的功能。使用Base64传输通过JSON存储并使用Node.js实现这个功能非常容易。然而,除了已知的带宽增加30%的缺点之外,是否有理由不使用此类型的文件上传方式,而使用AJAX或其他方式呢?您可以在回答中包含这一点以使其完整。
我被委托编写将图片上传到远程服务器并保存这些图片到本地的功能。使用Base64传输通过JSON存储并使用Node.js实现这个功能非常容易。然而,除了已知的带宽增加30%的缺点之外,是否有理由不使用此类型的文件上传方式,而使用AJAX或其他方式呢?您可以在回答中包含这一点以使其完整。
然而,通过使用Axios和一些懒加载器,例如react-lazyload或lazyload等,可以缓解这个问题。
该网站的开发人员可能选择通过使用神秘的URL等方式使网站看起来更加安全。然而,这并不意味着这是安全性靠模糊来保障。
如果他们的网站容易受到SQL注入攻击,并试图通过编码URL来隐藏这一点,那么这就是安全性靠模糊来保障。如果他们的网站已经很好地防范了SQL注入、XSS、CSRF等攻击,并且他们决定像那样编码URL,那么这就是纯粹的愚蠢行为。
对于文本编码的图片(例如svg),它并没有帮助(Probably Don't Base64 SVG)。
IE6或IE7以及Opera 7.2之前不支持数据URI(Which browsers support data URIs and since which version?)。
参考资料
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/
每种数据编码和解码都可以用于不同的原因,带来了利益和不利之处。
例如:
有很多编码算法可以改变数据,具有某些有用性。
但是,使用
Base64编码,它将每个6位数据编码成一个字符(8位)。 3字节到4字节,但它只包括62个不同的字母数字和2个符号。
它的好处是没有特殊字符和符号
它使得可能通过禁止我们拥有的渠道传输任何数据:
' " / \
...\0 \n \r \t \a
二进制文件通常包括任何数据,如果转换为ASCII,则可以是任何8位字符。
在某些协议和应用程序中,只接受少量字符(带有一些符号的字母数字)的I/O接口。
由于:
防止编码注入(例如:SQL注入或任何类似编程语言语法的字符;
)
或者只是某些字符已经在其协议中具有意义(例如,在URI QueryString中,字符&
具有意义,不能出现在任何QueryString值中)
或者输入不打算接受非字母数字值。 (例如:它应该仅接受人名)
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只是一种发送方式,就像其他方式一样。
我在我的一个项目中使用了相同的解决方案。
唯一的问题是请求体的大小。如果你的所有图片都很小,比如几兆字节,那么应该没问题。
我的服务器是asp.net core,它的maxAllowedContentLength值是30000000,大约28.6MB。当图片大小超过这个值时,请求会因为"request body too large"错误而失败。
我认为node.js应该有类似的设置,请确保根据你的需求进行调整。
请注意,当请求大小太大时,由于网络流量的原因,请求超时的可能性也相应增加。对于来自手机的请求尤其会成为一个问题。
我认为使用base64是有效的。
唯一的疑问是请求的大小,但如果在前端将此base64分成几部分,则可以避免这个问题。例如,对于一个30mb的文件,您可以将每个请求分成5mb,在后端将这些部分组合在一起。这甚至有助于在网络出现问题并且某些部分损坏时进行“保持下载”。
祝好
Base64 可将数据转换为二进制数据的 ASCII 表示形式。它允许您将数据嵌入到文本流中,例如 JSON。Base64 会增加传输的数据大小约 33%。
multipart/form-data 是在 HTTP 请求中传输二进制数据的标准方式。它允许您为每个要传输的部分使用特定的编码/内容类型。在我看来,除非您有特定的要求或设备/SDK 功能,否则应坚持使用多部分上传。
请查看以下链接