我按照 SO 中的几个示例从 zip 中获取图像文件,并将每个文件字节放入哈希图中:
final byte[] zip_file = ((CommonsMultipartFile) zip_file).getBytes();
zip_stream = new ZipInputStream(new ByteArrayInputStream(zip_file));
try {
while ((entry = zip_stream.getNextEntry()) != null) {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
try {
BufferedOutputStream dest = new BufferedOutputStream(baos, BUFFER_SIZE);
try {
int count = 0;
byte[] data = new byte[BUFFER_SIZE];
while ((count = zip_stream.read(data, 0, BUFFER_SIZE)) > 0) {
dest.write(data, 0, count);
}
dest.flush();
filelist.put(entry.getName(), baos.toByteArray());
baos.reset();
} finally {
dest.close();
}
} finally {
baos.close();
}
}
} finally {
zip_stream.close();
}
稍后从 读取时filelist
,字节数组将持久化为一个 java bean,就像这样
Customer customer = new Customer();
byte[] image = fileist.get(imageFileName);
customer.setImage(image);
Customer
是一个 JPA 实体,该字段image
具有@Lob
类型。所以这部分应该没有任何问题。
可悲的是,在整个交易之后,有一些数据写入了“图像”字段,但是来自 Oracle(使用 SQL 开发人员)的字节无法组合到图像文件中,这意味着来自 oracle 的文件已损坏。一定有什么问题导致字节损坏。我怎样才能让它工作?
更新
使用更改输入流-输出流传输IOUtils.copy
但仍然无法正常工作......但我觉得这里有问题但不知道如何解决。在下面的代码中,循环似乎适用于 zipInputStream 的每个条目,条目从未访问过而不是文件名,它看起来正常吗?
try {
while ((entry = zip_stream.getNextEntry()) != null) {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
try {
IOUtils.copy(zip_stream, baos);
} finally {
baos.close();
}
filelist.put(entry.getName(), baos.toByteArray());
}
} finally {
zip_stream.close();
}