1

很简单的问题,网上几乎没有答案。我使用 byte[] 作为我的对象。目前我正在将整个图像读入内存然后写入。非常简单。

    @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);
4

3 回答 3

2

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

b.getBinaryStream()

您也可以从创建 Blobbytes[]

Hibernate.createBlob(bytes);

最简单的解决方案 保存在硬盘上并将有关图像的信息保存在数据库中。

于 2012-04-20T18:37:26.113 回答
0

一种可能的解决方案是将文件名 (URL) 保存在数据库中,并从磁盘(网络资源)流式传输数据并流式传输它们。

我更喜欢这种网络方法——当你只返回一个 URL 并且它由浏览器和 Apache/Nginx 处理时(所以你根本不必担心流式传输)。

于 2012-04-20T18:19:53.457 回答
-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);
于 2012-04-23T15:08:59.987 回答