如何在 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 2 - 使用CommandLineRunner与ApplicationRunner
如何在 Spring Boot REST 应用程序中重用类?