0

我是 Java 开发的新手,所以如果我问一些愚蠢的问题,请提前道歉。

我正在尝试从 sql 数据库中检索图像和缩略图。ResultSet我从格式中获取数据BinaryStream,然后将其转换为byte[].

对于缩略图,它工作正常,对于原始图像,我也可以BinaryStream使用getBinaryStream方法检索但是当我将它转换为时,由于某种原因byte[],数组仍然为空。

binaryStream = rs.getBinaryStream("image");
thumbBinaryStream = rs.getBinaryStream("thumbnail");
if (binaryStream != null) {
    // Tested on following line and I get empty imageBytes
    byte[] imageBytes = IOUtils.toByteArray(binaryStream); 
    thisRecord.put("image", DatatypeConverter.printBase64Binary(imageBytes)); // imageBytes is empty here 
}
4

2 回答 2

0

可以肯定的是:Statement 和 ResultSet 必须关闭,并且getBinaryStream仅在 ResultSet 仍然打开时使用,例如:

try (ResultSet rs = stmt.executeQuery()) {
    while (rs.next()) {
        InputStream binaryStream = rs.getBinaryStream("image");
        InputStream thumbBinaryStream = rs.getBinaryStream("thumbnail");
        if (binaryStream != null) {
            // Tested on following line and I get empty imageBytes
            byte[] imageBytes = IOUtils.toByteArray(binaryStream); 
            thisRecord.put("image", DatatypeConverter.printBase64Binary(imageBytes));
            boolean mustGenerateThumbnail = thumbBinaryStream == null;
            if (mustGenerateThumbnail ) {
                thumbBinaryStream = generateThumbnail(imageBytes);
            }
            byte[] thumbBytes = IOUtils.toByteArray(thumbBinaryStream);
            thisRecord.put("thumbnail", DatatypeConverter.printBase64Binary(thumbBytes));

在这里,我们遇到了错误。此时 thumbBinaryStream 被读取到最后,所以这样做:

            if (mustGenerateThumbnail ) {
                ByteArrayInputStream baIn = new ByteArrayInputStream(thumbBytes);
                saveThumbnailForRecordWithId(baIn, floor_drawing_id);
            }
        }
    }
}

(这里我使用 try-with-resources 来自动关闭 ResultSet,即使抛出异常也是如此。)

此外,Base64 还有一个更通用的类。如果您将来有这样的需要。

DatatypeConverter.printBase64Binary(thumbBytes)
Base64.getEncoder().encodeToString(thumbBytes)
于 2018-07-10T15:00:31.200 回答
0

我们可能需要更多信息,尤其是有关列的数据类型的信息,但可能有助于从 BLOB 中检索流,如下例所示:

if (rs.getMetaData().getColumnType(column) == Types.BLOB) {
        in = rs.getBlob(column).getBinaryStream();
    } else {
        in = rs.getBinaryStream(column);
    }
于 2018-07-10T14:39:09.657 回答