1

我将图像作为 blob 存储在 MySQL 中(我知道这是错误的)。而且还有很多。有没有什么快速的方法可以将它们全部放在磁盘上,比如SELECT .. INTO OUTFILE,但是对于一个插入的许多文件?或者唯一的方法是编写一个遍历行并保存图像的脚本?

4

3 回答 3

3

由于您希望将它们保存到磁盘上的不同文件中,因此您必须使用脚本。

于 2009-12-22T17:14:39.273 回答
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++;
}
于 2009-12-22T19:10:44.343 回答
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()

;

...

如果您看起来它可能有用,我可以发布一个更完整的示例 - 但我会从一个更大的项目中提取代码,否则我会直接发布它。

于 2009-12-22T17:28:34.203 回答