【问题标题】:Unload images from MySQL to disk将图像从 MySQL 卸载到磁盘
【发布时间】:2009-12-22 17:09:53
【问题描述】:

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

【问题讨论】:

  • 只是出于兴趣,为什么会出错? [我也一直避免将 Blob 用于图像数据,但我没有这样做的充分理由! (除了图像数据对诊断/调试更加“隐藏”这一事实之外)。
  • 慢得像糖蜜。

标签: mysql sql into-outfile


【解决方案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++;
    }
    

    【讨论】:

      【解决方案3】:

      我有一个类似的要求,我发现在我的案例中使用 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()
      

      ;

      ...

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

      【讨论】:

      • 很遗憾,我不懂 Java。但我很确定我可以在 PHP 中做到这一点:)
      猜你喜欢
      • 1970-01-01
      • 2013-02-10
      • 1970-01-01
      • 2018-10-23
      • 1970-01-01
      • 1970-01-01
      • 2012-08-20
      • 1970-01-01
      • 2011-08-25
      相关资源
      最近更新 更多