首页 > 解决方案 > 如何在 Flutter+Spring Boot+PostgreSQL+Heroku 结构中发送和存储图像?

问题描述

我正在开发一个带有Flutter框架的移动应用程序。

在后端 API 方面,我使用Spring Boot框架并将其部署到Heroku(免费计划)。

在数据库方面,我PostgreSQLHeroku.

在处理图像之前一切正常。当我需要将图像发送到服务器并存储它时,我感到很困惑。它的最佳实践是什么?经过一番搜索,我看到了两个选项。这些是:

第一个选项

  1. Flutter侧面,从用户那里获取图像
  2. Flutter侧面,将图像转换为BASE64字符串格式。
  3. Flutter侧面,POST它作为JSON后端的对象。
  4. Spring Boot侧面,获取BASE64字符串并将其存储到 PostgreSQL数据库中。

第二种选择

  1. Flutter侧面,从用户那里获取图像
  2. Flutter侧面,将图像转换为BASE64字符串格式。
  3. Flutter侧面,POST它作为JSON后端的对象。
  4. Spring Bootside中,获取BASE64字符串并将其转换为真实的图像文件;
  5. Spring Boot侧面,将实际的图像文件保存到主机的文件系统中,并将图像的路径存储到 PostgreSQL数据库中。(但是 Heroku 不允许在其文件系统上写入)(即使可以在其文件系统上写入,每次新部署,图像都会消失)

如果我选择第二个选项,我应该怎么做才能解决文件系统中的保存图像Heroku

我应该使用哪个选项?

还有其他好的选择吗?

标签: databasepostgresqlspring-bootherokufile-upload

解决方案


我觉得你应该:

  1. 在 Flutter 应用中从用户那里获取图像;
  2. 将图片转换为base64格式;
  3. 通过rest api以json格式发送到后端;
  4. 在spring应用程序中将字符串转换为blob数据并保存在数据库中;

当您需要阅读时:

  1. 从数据库中检索 blob;
  2. 转换为字符串;
  3. 发送到flutter;
  4. 转换为真实图像;

我通常用这种方法来面对这个要求,而且效果很好。我在下面写了一个简单的函数,从/到你可以使用的 blob/string

到Blob

public static Blob toBlob(String s) throws SQLException {
   if (Objects.nonNull(s)) {
      return new SerialBlob(s.getBytes(StandardCharsets.UTF_8));
   } else return null;
}

public static String toString(Blob b) throws SQLException {
   if (Objects.nonNull(b)) {
     return new String(b.getBytes(1L, (int) b.length()), StandardCharsets.UTF_8);
   } else return null;
}

推荐阅读