Выгрузить образы с MySQL на диск - PullRequest
1 голос
/ 22 декабря 2009

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

Ответы [ 3 ]

3 голосов
/ 22 декабря 2009

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

2 голосов
/ 22 декабря 2009
#!/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++;
}
0 голосов
/ 22 декабря 2009

У меня было похожее требование, которое я обнаружил в моем случае с использованием 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 для генерации имени файла), что-то вроде этого:

...

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

;

...

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

...