java - 我应该在将文件发送到后端之前还是之后将其转换为 Base64?

标签 java sql base64

首先,我知道在数据库中保存 Base64 字符串并不是保存图像的最有效方法,但我没有很多图像并且很少加载它们,所以这应该不是问题。

所以让我们开始吧,我有一个 SQL 数据库,其中有一个表“图片”,该表有两列、一个唯一的名称和一个代表 64 进制文件的字符串:

@Entity
public class Picture {

  @Id
  @GeneratedValue(strategy = GenerationType.AUTO)
  private long id;

  @Column(unique = true)
  private String name;
  private String imageInBase64;
}

用户可以在用户界面中选择图像,然后通过 REST 发送到后端。我的问题是,我应该在将文件/图片发送到后端之前将其编码为 Base64 还是应该在接收后在后端对其进行编码?目前我只是在前端对其进行编码并发送表示 Picture 类的 JSON。

最佳答案

这是来自这篇文章... Storing image in database directly or as base64 data?

我认为图像(文件)通常不存储在 Base64 编码的数据库中。相反,它们以原始二进制形式存储在二进制(blob)列(或文件)中。

Base64 仅用作传输机制,不用于存储。例如,您可以将 Base64 编码的图像嵌入到 XML 文档或电子邮件中。

Base64 也是流友好的。您可以即时编码和解码(无需知道数据的总大小)。

虽然 Base64 适合传输,但请勿存储 Base64 编码的图像。

Base64 不提供校验和或任何具有存储值(value)的内容。

与原始二进制格式相比,Base64 编码的存储要求增加了 33%。它还增加了必须从持久存储中读取的数据量,这通常仍然是计算中最大的瓶颈。通常,读取较少的字节并对其进行动态编码会更快。仅当您的系统受 CPU 限制而不是 IO 限制,并且您定期以 Base64 输出图像时,才考虑以 Base64 存储。

内联图像(嵌入 HTML 中的 Base64 编码图像)本身就是一个瓶颈 - 您通过线路发送的数据多了 33%,并且是串行执行的(Web 浏览器必须等待内联图像才能完成)下载页面 HTML)。

如果您仍然希望存储 Base64 编码的图像,请无论您做什么,请确保不要将 Base64 编码的数据存储在 UTF8 列中,然后对其进行索引。

关于java - 我应该在将文件发送到后端之前还是之后将其转换为 Base64?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58626803/

相关文章:

sql - 如何在sql中条件为真时选择一行,条件为假时选择另一行?

c# - 处理 XML 更改的好方法

php - 使用 base64 编码的字符串 URL

Java 9 接口(interface) : Why default Modifier Converted into public Modifier

Java SPARQL 选择查询

java - 在 eclipse 中安装了深色主题,但滚动条仍然是灰色的

java - 计数原始操作,Big O Notation

当我将列的大小从 BIGINT(11) 更改为 BIGINT(20) 时,MySql 表列删除了其 AI 标志

ruby-on-rails-3 - 保存前使用回形针图像

c# - 将 base 64 字符串插入 SQL Server 数据库