簡體   English   中英

從MySQL卸載映像到磁盤

[英]Unload images from MySQL to disk

我將圖像作為Blob存儲在MySQL中( 我知道這是錯誤的 )。 而且有很多。 是否有任何快速的方法可以將它們全部拖放到磁盤上,例如SELECT .. INTO OUTFILE ,但可以放入許多由一個文件插入的文件中? 還是唯一的方法是編寫將遍歷行並保存圖像的腳本?

由於要將它們保存到磁盤上的其他文件中,因此必須使用腳本。

#!/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++;
}

我有一個類似的要求,在我的案例中,我發現使用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”來稱呼它)提取斑點(使用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()

;

...

如果您覺得它可能有用,那么我可以發布一個更完整的示例-但是我會從一個更大的項目中提取代碼,否則我會直接發布它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM