2009-12-22 1 views
1

У меня есть изображения, хранящиеся в MySQL как blobs (Я знаю, что это неправильно). И их много. Есть ли быстрый способ бросить их все на диск, например, SELECT .. INTO OUTFILE, но для многих файлов insted из одного? Или единственный способ написать скрипт, который будет перебирать строки и сохранять изображения?Выгрузить изображения из MySQL на диск

+0

Просто вне интереса, почему это неправильно? [Я всегда избегал использования данных Blobs for Image, но у меня нет веских оснований для этого! (Помимо того факта, что данные изображения более «скрыты» от диагностики/отладки). – monojohnny

+0

Это медленно, как меласса. –

ответ

3

Поскольку вы хотите, чтобы они были сохранены в разные файлы на диске, вам придется искать сценарий.

0

У меня было аналогичное требование, которое я нашел в моем случае с использованием Java + Hibernate (возможно, аналогичная задача в других вариантах Hibernate, но не пробовал), заставил меня там довольно быстро.

настроить отображение так:

<hibernate-mapping> 
    <class name="<com.package.table>" table="table"> 
    <id column="pk" name="pk" type="int"> 
    </id> 
    <property name="blobfield" type="blob"/> 
    </class> 
</hibernate-mapping> 

Java, компонент для передачи данных, что-то вроде:

package com.package; 
import java.sql.Blob; 
... 
public class table { 
... 
public Blob getBlobfield { 
... 

И есть что-то петли так:

... 
tx = session.beginTransaction(); 
Criteria crit = session.createCriteria(table.class); 
crit.setMaxResults(50); // Alter this to suit... 
      List<table> rows = crit.list(); 
      for (table r: rows) { 
       ExtractBlob(r.getId(), r.getBlobField); 
} 

И что-то («ExtractBlob» - это я это вызываю), чтобы извлечь blob (используя PK для генерации имени файла), что-то li ке это:

...

FileOutputStream fout=new FileOutputStream(<...base output file on PK for example...> 
BufferedOutputStream bos=new BufferedOutputStream(fout); 
InputStream is=blob.getBinaryStream(); 
byte[] b=new byte[8192]; 
while ((is.read(b))>0) { 
     bos.write(b); 
} 
is.close(); 
bos.close() 

;

...

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

+0

К сожалению, я не знаю Java. Но я уверен, что смогу это сделать на PHP :) –

2
#!/usr/bin/perl 

#Note: it is my habit to name a Query Result $qR. 

use strict; 
use DBI; 
my $dbh = DBI->connect(YOUR_INFO_HERE); 

my $i = 0; 
my $q = $dbh->prepare('select image from images'); 
while (my $qR = $q->fetchrow_arrayref) { 
    open(FILE,'>',"$i.jpg"); 
    print FILE $qR[0]; 
    close FILE; 
    $i++; 
} 

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

  • Нет связанных вопросов^_^