2012-04-20 68 views
1

很简单的问题,在网上几乎没有答案。我使用byte []作为我的对象。目前,我正在将整个图像读入内存,然后写入内存。很简单。如何使用Hibernate将图像流式传输到数据库中?

@Column(name = "FILE_DATA") 
private byte[] fileData; 

我想流它。因此,我想我需要使用inputStream,但休眠不喜欢那样。

我该如何设置?

编辑:

我试过,但有一个-314 DB2错误:

Blob b = null; 
     try { 
      Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("proxy.com", 80)); 
      URL urls = new URL(url); 
      URLConnection conn = urls.openConnection(proxy); 
      b = new BlobImpl(conn.getInputStream(), conn.getContentLength()); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

     att.setFileData(b); 
     this.theDao.save(att); 
+0

Ahhhh ......这一次,我假设文件是​​ local *。这是一个很好的问题,但我认为你需要充实一点。尝试使用简单的裸骨方法。不要担心捕捉异常。 – 2012-04-24 15:14:18

+0

作为一个测试,可以使用conn.getInputStream()来将文件存储在本地文件系统上吗? – 2012-04-24 15:17:48

回答

2

您可以使用Blob数据类型插入和从数据库获取图像。它也将为您提供二进制输入流的选项。只需使用你的db字段作为blob,并创建一个blob ojbect而不是字节数组。

b.getBinaryStream() 

您也可以从bytes[]

Hibernate.createBlob(bytes); 

而且它对数据库映像的硬盘驱动器上的简单的解决方案保存和保持信息创造斑点。

+0

那么如何设置栏目? – markthegrea 2012-04-20 18:47:04

+0

'@Column(name =“FILE_DATA”)@Lob(type = LobType.BLOB)' – Shehzad 2012-04-20 18:58:35

+0

您刚给我足够让我想要更多。有没有一些实际的代码?要创建一个blob,你需要内容的长度。我如何通过流获取?我必须先阅读流吗?如果是这样,这没有帮助。 – markthegrea 2012-04-20 20:03:25

0

一个可能的解决方案是保持在从磁盘数据库和数据流文件名(网址)(网络资源)并将其流式传输。

我更喜欢这种方法的网络 - 当你只是返回一个URL,它由浏览器和Apache/Nginx处理(所以你不必担心流媒体)。

+0

这是遍布网络的答案,但对于我们中的一些人,已决定将其保存到数据库中。这个答案不回答问题。 – markthegrea 2012-04-20 18:48:54

-1

我不知道我明白你的意思是“冬眠不喜欢那样”?

下面是定义的简单程度。

@Entity Photo { 
    @Id @GeneratedValue 
    private Long id = null; 

    private String filename = null; 

    @Lob 
    private byte[] bytes = null; 
    } 

然后将数据加载到目标...

String filename = // Where ever this comes from... 
File file = new File(filename); 
InputStream is = new FileInputStream(file); 

Photo photo = new Photo(); 
photo.setFilename(filename); 

// Create and fill the byte array from the file. 
byte[] bytes = new byte[(int) file.length()]; 
is.read(bytes); 
photo.setBytes(bytes); 

然后最终让Hibernate将其保存在数据库中。

session.saveOrUpdate(photo); 
+1

这不是流媒体。这是读入内存然后保存它。我需要打开流,然后将其发送到数据库并保存。我不希望加载大量图像的内存影响... – markthegrea 2012-04-23 19:03:23

+0

哦。你想直接*流到Hibernate之外的数据库中?你是对的,这完全不是。但是,java.sql.Blob(http://docs.oracle.com/javase/1.4.2/docs/api/java/sql/Blob.html)确实有可能适用于您的方法。 – 2012-04-24 01:28:19

相关问题