Java 我应该在将文件发送到后端之前或之后将其转换为Base64吗?

Java 我应该在将文件发送到后端之前或之后将其转换为Base64吗?,java,sql,base64,Java,Sql,Base64,首先,我知道在数据库中保存Base64字符串并不是保存图像的最有效方法,但我没有很多图像,很少加载它们,所以这应该不是问题 首先,我有一个SQL数据库,其中有一个表“pictures”,它有两列,一个唯一的名称和一个表示base 64中文件的字符串: @Entity public class Picture { @Id @GeneratedValue(strategy = GenerationType.AUTO) private long id; @Column(unique

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

首先,我有一个SQL数据库,其中有一个表“pictures”,它有两列,一个唯一的名称和一个表示base 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。

这是本文中的内容。。。https://stackoverflow.com/questions/9722603/storing-image-in-database-directly-or-as-base64-data

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

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

Base64也是流友好的。您可以动态编码和解码(不知道数据的总大小)

虽然base64适合传输,但不要存储base64编码的图像

Base64不提供校验和或任何存储值

Base64编码比原始二进制格式增加了33%的存储需求。它还增加了必须从持久存储中读取的数据量,这通常仍是计算中最大的瓶颈。读取更少的字节并动态编码通常会更快。只有当你的系统是CPU绑定而不是IO绑定时,你才定期在Base64中输出图像,然后考虑在Base64。< /P>中存储。 内联图像(嵌入HTML中的base64编码图像)本身就是一个瓶颈——您通过网络发送的数据增加了33%,并且是串行发送的(web浏览器必须等待内联图像,然后才能完成HTML页面的下载)


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

如果您使用JSON将其发送到后端,如果您不使用base64,您建议如何表示它?@JonSkeet因为base64正在增加负载大小,没有其他选择吗?早些时候,当使用HTTP servlet进行文件上载时,我们只是让表单成为要发布的二进制数据的多部分表单数据。这对REST/JSON API不起作用吗?@yathirigan:我希望任何REST/JSON API都希望整个请求都在JSON中。(一个包含多个部分的请求作为抽象可能会变得有些笨拙。)在某些情况下,另一种选择是使用一个API返回一个URL,将二进制数据发布到其中。@JonSkeet,这样我仍然可以将多部分表单数据与REST API一起使用,但它可能不接受JSON输入格式/约定。这种理解正确吗?另外,我可以在base64编码之前在客户端gzip/压缩数据吗?@yathirigan:所讨论的API必须明确知道这一点。如果您控制着API并决定允许它,那么这就是您的选择。它是否会被称为“RESTful”并不是一个真正的技术决定。至于压缩-当然,您可以(尽管您希望在请求中的某个地方表明您已经这样做了,API也需要知道这一点)-但是大多数“大”数据块(图像、视频、zip文件)已经被压缩了。