2012-04-20 2 views
1

Довольно простой вопрос с почти нет ответов в Интернете. Я использую byte [] как свой объект. В настоящее время я читаю весь образ в памяти, а затем записываю его. Очень просто.Как вы поместите изображение в базу данных с помощью Hibernate?

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

Я хочу Стрим его. Так что я думаю, мне нужно использовать InputStream, но спящий режим не так.

Как это установить?

EDIT:

Я попытался это, но получил ошибку в -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 *. Это большой вопрос, но я думаю, вам нужно больше его использовать. Попробуйте включить простой метод bare-bones. Не беспокойтесь о том, чтобы поймать исключения. –

+0

В качестве теста можно использовать conn.getInputStream() для хранения файла в локальной файловой системе? –

ответ

2

Вы можете использовать тип данных Blob для вставки и получения изображений из базы данных. Он также предоставит вам возможность двоичного входного потока. Просто используйте поле db как blob и создайте blob ojbect вместо байтового массива.

b.getBinaryStream() 

Также вы можете создать Blob из bytes[]

Hibernate.createBlob(bytes); 

И самое простое решение экономии на жестком диске и хранение информации об изображении в базе данных.

+0

Итак, как мне настроить столбец? – markthegrea

+0

'@Column (name = "FILE_DATA") @Lob (type = LobType.BLOB)' – Shehzad

+0

Вы даете мне достаточно, чтобы заставить меня хотеть большего. Есть ли какой-то реальный код? Чтобы создать blob, вам нужна длина содержимого. как мне получить это с потоком? Должен ли я сначала прочитать поток? Если это так, это не помогает. – markthegrea

0

Одним из возможных решений является сохранить имена файлов (URL) в базах данных и потоковых данных с диска (сеть ресурсов) и поток их.

Я бы предпочел этот подход для Интернета - когда вы просто возвращаете URL-адрес, и он обрабатывается браузером и Apache/Nginx (так что вам вообще не нужно беспокоиться о потоковой передаче).

+0

Это ответ, который существует во всем Интернете, но для некоторых из нас было принято решение сохранить его в базе данных. Этот ответ не отвечает на заданный вопрос. – markthegrea

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

Тогда в конечном итоге сказать, спящий режим, чтобы сохранить его в базе данных.

session.saveOrUpdate(photo); 
+1

Это не потоковая передача. Это считывается в память, а затем сохраняется. Мне нужно открыть поток, а затем отправить его в базу данных и сохранить его. Я не хочу, чтобы влияние памяти на загрузку большого количества изображений ... – markthegrea

+0

Oh. Вы хотите передать его * напрямую * в базу данных, за пределами Hibernate? Вы правы, это совсем не так. Однако у java.sql.Blob (http://docs.oracle.com/javase/1.4.2/docs/api/java/sql/Blob.html) есть методы, которые могут сработать для вас. –

Смежные вопросы