如何在 Flutter+Spring Boot+PostgreSQL+Heroku 结构中发送和存储图像?

Posted

技术标签:

【中文标题】如何在 Flutter+Spring Boot+PostgreSQL+Heroku 结构中发送和存储图像?【英文标题】:How to send and store image in a Flutter+Spring Boot+PostgreSQL+Heroku structure? 【发布时间】:2020-07-28 06:23:05 【问题描述】:

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

在后端 API 方面,我使用 Spring Boot 框架并将其部署到 Heroku(free-plan)。

在数据库方面,我在Heroku 中使用PostgreSQL 附加组件。

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

第一个选项

    Flutter侧,从用户那里获取图片 在Flutter端,将图片转换为BASE64字符串格式。 在Flutter 端,POST 它作为JSON 对象发送到后端。 在Spring Boot 端,获取BASE64 字符串并将其存储到 PostgreSQL分贝。

第二个选项

    Flutter一侧,从用户那里获取图像 在Flutter端,将图片转换为BASE64字符串格式。 在Flutter 端,POST 它作为JSON 对象发送到后端。 在Spring Boot 端,获取BASE64 字符串并将其转换为 真实图片文件; 在Spring Boot端,将实际图片文件保存到文件中 主机系统和图像的存储路径 PostgreSQL分贝。 (但 Heroku 不允许在其文件系统上写入) (甚至可以在它的文件系统上写,每一个新的 部署,图像将消失)

如果我选择第二个选项,我应该如何解决Heroku文件系统中的保存图像?

我应该使用哪个选项?

还有其他好的选择吗?

【问题讨论】:

【参考方案1】:

通常不建议将图像保存在数据库中。相反,您可以尝试在另一个允许文件存储的平台(例如 AWS)上托管。

但是,如果您没有太多图像并且不会经常访问它们,则可以将它们存储在数据库中。然而,我建议让 Spring boot 将您的 BASE64 字符串转换为实际图像,而不是第一个选项。然后,您可以将此图像作为 BLOB 存储在数据库中。这可确保数据库针对 BLOB 进行优化,并且不会为文本条目创建索引和其他优化。

【讨论】:

【参考方案2】:

我认为你应该:

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

当您需要阅读时:

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

我通常用这种方法来面对这个要求,而且效果很好。 我在下面写了一个简单的函数,从/到你可以使用的 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;

toString

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;

【讨论】:

以上是关于如何在 Flutter+Spring Boot+PostgreSQL+Heroku 结构中发送和存储图像?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Spring Boot CrudRepository 中搜索数组

如何在 Spring Boot 中为所有控制器指定前缀?

Spring Boot 2 - 使用CommandLineRunner与ApplicationRunner

如何在 Spring Boot REST 应用程序中重用类?

如何使用邮递员和 Spring Boot 发送 multipartFile 和 Json

spring boot应用启动原理分析