我将图像存储在MySQL中作为blob(我知道它是错误的)。其中有很多。是否有任何快速方法可以将它们全部放在磁盘上,例如SELECT .. INTO OUTFILE
,但是对于许多文件只有一个?或者唯一的方法是编写一个迭代行并保存图像的脚本?
答案 0 :(得分:3)
由于您希望将它们保存到磁盘上的不同文件中,因此您必须使用脚本。
答案 1 :(得分: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++;
}
答案 2 :(得分: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 bean,如:
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()
...
如果您认为它可能有用,我可以发布一个更完整的示例 - 但我会从更大的项目中提取代码,否则我会直接发布它。