У меня есть изображения, хранящиеся в MySQL как blobs (Я знаю, что это неправильно). И их много. Есть ли быстрый способ бросить их все на диск, например, SELECT .. INTO OUTFILE
, но для многих файлов insted из одного? Или единственный способ написать скрипт, который будет перебирать строки и сохранять изображения?Выгрузить изображения из MySQL на диск
ответ
Поскольку вы хотите, чтобы они были сохранены в разные файлы на диске, вам придется искать сценарий.
У меня было аналогичное требование, которое я нашел в моем случае с использованием 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()
;
...
я могу опубликовать более полный пример, если похоже, что это может быть полезно - но я бы извлечь код из более крупного проекта, в противном случае я бы просто отправил его прямо вверх.
К сожалению, я не знаю Java. Но я уверен, что смогу это сделать на PHP :) –
#!/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++;
}
Просто вне интереса, почему это неправильно? [Я всегда избегал использования данных Blobs for Image, но у меня нет веских оснований для этого! (Помимо того факта, что данные изображения более «скрыты» от диагностики/отладки). – monojohnny
Это медленно, как меласса. –