将映像从MySQL卸载到磁盘

时间:2009-12-22 17:09:54

标签: mysql sql into-outfile

我将图像存储在MySQL中作为blob(我知道它是错误的)。其中有很多。是否有任何快速方法可以将它们全部放在磁盘上,例如SELECT .. INTO OUTFILE,但是对于许多文件只有一个?或者唯一的方法是编写一个迭代行并保存图像的脚本?

3 个答案:

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

...

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