如何使用 Java 将 base 64 图像插入 BLOB 列? (甲骨文)

Posted

技术标签:

【中文标题】如何使用 Java 将 base 64 图像插入 BLOB 列? (甲骨文)【英文标题】:How to insert a base 64 image into a BLOB column with Java? (Oracle) 【发布时间】:2021-11-12 13:31:38 【问题描述】:

我正在从事一个从 API 获取 base 64 图像的项目,我想将它作为图像 (BLOB) 存储在 Oracle 表中。这是我试图做的,但它当然没有用:

// The real image64 String is around 40k of length
String image64 = "/9j/4AAQSkZJRgABAQAAAQABAAD......RzUUUBB2UtRREOFFFFpa//Z";

Statement stmt = connection.createStatement();
stmt.executeQuery("INSERT INTO INFO (IMAGE) VALUES (TO_BLOB('"+image64+"'))");

我得到的错误是:

java.sql.SQLException: ORA-01704 String literal too long

现在,我知道一种解决方法是将字符串分成块并像这样插入:

INSERT INTO INFO (IMAGE) VALUES (TO_BLOB('"+chunk1+"') || (TO_BLOB('"+chunk2+"') || ...))

我也尝试过这样做。但是,就像我在第一个代码 sn-p 中评论的那样,字符串的长度约为 40k,所以当我尝试将它分成 4000 个字符的块时,由于某种原因,命令(真的,真的很长)是没有完全发送。它突然结束,就像我溢出了 String 类型的容量什么的。

这是我发送的:

INSERT INTO INFO (IMAGE) VALUES (
TO_BLOB('/9jGOL5K...really long string...MdlNjgx45ouz')
|| TO_BLOB('U1hNR...really long string...95hcktXXLHV0uOW5tSQV')
|| TO_BLOB('RcB7Z...really long string...S6P4mGN3eXny6trpcI4X')
|| TO_BLOB('eOy4n...really long string...MrS06QOZ8Su2Tl8hjxH1')
|| TO_BLOB('7SNrA...really long string...TmyBzdiC2ye8drBNWaPi')
|| TO_BLOB('H1rnk...really long string...O5dqJ86r6bIxwxxf0bA3')
|| TO_BLOB('TxS0N...really long string...ZOT+7A9w+QVjZGvbqY15')
|| TO_BLOB('eHEiR...really long string...Lm3ECxuzQ9xdbiNtQBJ6')
|| TO_BLOB('o8Kjj...really long string...eDR1FqywLLlukprsXFk7')
|| TO_BLOB('ALzL/...really long string...PC6nmNf6Ip+vL4beqAF8')
)

这就是服务器得到的(根据 Navicat 11.0.8):

INSERT INTO INFO (IMAGE) VALUES (
    TO_BLOB('/9jGOL5K...really long string...MdlNjgx45ouz')
    || TO_BLOB('U1hNRwniiRW6rdyXZz8QSQulYBqYO95

如您所见,它几乎没有进入第二块。难怪我得到这个错误:

[Err] ORA-00933: command not properly ended

我真的不知道该如何处理。我尝试做同样的事情,但用 CLOB 代替,没有任何改变。想法?我知道 oracle.sql.BLOB 包中有一个 BLOB 类型,但是我不明白如何使用它,也不知道如何通过阅读文档来存储它。

想法?

【问题讨论】:

出于这样的原因将图像存储在数据库中通常不是一个好主意。考虑在您自己的代码中进行转换并从那里插入二进制数据? 是的,我看到了一些关于将其转换为二进制的内容,但我不知道如何编写代码……我看到的示例不清楚 你输入的数据是BASE64字符串还是二进制数据?要将 CLOB/BASE64 字符串转换为 BLOB 并返回,请参阅***.com/questions/42085147/… 【参考方案1】:

问题是您试图在 sql 语句中包含该值。这绝不是一个好主意(因为它会导致 SQL 注入等安全问题)。为了做你想做的事,你需要使用PreparedStatement。您使用“?”构造查询值的占位符,然后使用 PreparedStatement 上的设置器来提供实际值。在您的情况下,您可能希望通过setBinaryStream() 提供包含图像数据的InputStream

InputStream imageStream = ...;
PreparedStatement ps = connection.prepareStatement("INSERT INTO INFO (IMAGE) VALUES (?)");
ps.setBinaryStream(1, imageStream);
ps.execute();

【讨论】:

你能给我发一个这种方法的代码示例吗? @ViníciusAbner 我的回答中有一个代码示例,还有很多更详细的在线示例,请尝试谷歌搜索“java insert blob into database” @ViníciusAbner 如果给定的 sn-p 对您来说还不够,您可能需要学习更多。这只是您在与数据库交谈时会遇到的“有趣问题”中的第一个。 当我发布评论时,代码 sn-p 没有显示。这就是为什么我要一个例子

以上是关于如何使用 Java 将 base 64 图像插入 BLOB 列? (甲骨文)的主要内容,如果未能解决你的问题,请参考以下文章

php 将base64图像数据插入到fpdf中

使用 PL/SQL 将 base64 图像解码为 BLOB

如何将 URL 从 Webapi 传递到 <img> 标签以接受 base64 的图像?

Openxml单词插入图像

如何使用颤振将 Base64 字符串解码为图像文件

如何使用 Cordova 应用程序将 base64 图像保存到设备中?