代码之家  ›  专栏  ›  技术社区  ›  Kuroki Kaze

将图片从MySQL卸载到磁盘

  •  1
  • Kuroki Kaze  · 技术社区  · 15 年前

    我在MySQL中以blobs的形式存储图像( 我知道这是错的 )其中有很多。有什么快速的方法可以把它们全部放在磁盘上吗? SELECT .. INTO OUTFILE 但是对于许多文件来说,一个?或者唯一的方法是编写一个脚本,该脚本将遍历行并保存图像?

    3 回复  |  直到 14 年前
        1
  •  3
  •   codaddict    15 年前

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

        2
  •  2
  •   Jeff Ferland    15 年前
    #!/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
  •  0
  •   monojohnny    15 年前

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

    还有一些东西(“extract blob”是我调用它)来提取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()
    

    ;

    如果你觉得它可能有用的话,我可以发布一个更完整的例子——但是我可以从一个更大的项目中提取代码,否则我就直接发布了。

    推荐文章