如何插入一个base 64图像到BLOB列与Java?(Oracle)



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

// 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+"') || ...))

我也试过那样做。然而,就像我在第一个代码片段中注释的那样,字符串的长度大约是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类型,但是我不知道如何使用它,也不知道如何通过阅读文档来存储它。

想法?

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

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

最新更新