プロが教える店舗&オフィスのセキュリティ対策術

BLOB型にPDFファイルが格納されているテーブルの列を、select文で抽出して、拡張子にpdfをつけてファイル出力したのですが、BLOBで定義している最大サイズで必ず出力されてしまいます。

pdf のファイルをテキストで開いてみると、エンド(%%EOF)以降が空欄でBLOBのサイズの大きさまで充填されていました。

BLOB型にPDFファイルを格納してある場合の出力方法はどうすればいいのでしょうか?

A 回答 (3件)

SELECTした結果をリダイレクトすると、桁揃えされてるので、


BLOBに限らずVARCHARもフル桁出力されちゃうと思います。
#1に書いたように、INTO DUMPFILEで1レコードずつ出力しましょう。

参考URL:http://dev.mysql.com/doc/refman/5.1/ja/select.ht …

この回答への補足

そういうことだったのですね。
ありがとうございます。

補足日時:2011/10/27 10:11
    • good
    • 0

import java.io.*;


import java.sql.*;

public class sqlblob1{

public static void main( String args[] ){
try{
Class.forName("com.mysql.jdbc.Driver");
String url = "jdbc:mysql://localhost/test?user=xxx&password=xxx";
Connection conn = DriverManager.getConnection(url);
File file = new File("c:\\Users\\nakagawa_takashi\\A-2.pdf");
FileInputStream fis = new FileInputStream(file);
PreparedStatement ps = conn.prepareStatement("INSERT INTO images VALUES (?, ?)");
ps.setString(1, file.getName());
ps.setBinaryStream(2, (InputStream)fis, file.length());
ps.executeUpdate();
fis.close();
ps.close();
conn.close();
}catch( Exception e ){
System.out.println("Exception");
if (e instanceof SQLException) {
System.out.println("エラー・コード: " +
((SQLException)e).getErrorCode());
}

}
}
}

============================================

import java.io.*;
import java.sql.*;

public class sqlblob2{
public static void main( String args[] ){
try{

Class.forName("com.mysql.jdbc.Driver");
String url = "jdbc:mysql://localhost/test?user=xxx&password=xxx";
Connection conn = DriverManager.getConnection(url);

try{
File file = new File("B-2.pdf");
if ( ! file.exists() ){
file.createNewFile();
}

PreparedStatement ps = conn.prepareStatement("SELECT img FROM images WHERE imgname = ?");
ps.setString(1, "A-2.pdf");
ResultSet rs = ps.executeQuery();
rs.next();
System.out.println("result set next successfull");

byte[] imgBytes = rs.getBytes(1);
System.out.println("getbytes successfull");

//バイト配列ストリーム作成
ByteArrayOutputStream baos=new ByteArrayOutputStream();
//ファイルストリーム作成
FileOutputStream fos=new FileOutputStream(file);

System.out.println("初期のバッファサイズ="+baos.size());
baos.write(imgBytes);//ストリームに書き込み
baos.writeTo(fos);//ファイルに書き込み
fos.close();//ファイルを閉じる

baos.reset();//ストリームを消去
System.out.println("リセット後バッファサイズ="+baos.size());

baos.close();//ストリームを閉じる
}catch( Exception e ){
System.out.println("Exception");
if (e instanceof SQLException) {
System.out.println("エラー・コード: " +
((SQLException)e).getErrorCode());
}
}

}catch(Exception e){
System.out.println("connection error");
System.exit(1);
}
}
}
でやって見ましたが再現しませんでした。

この回答への補足

プログラムを介して取り出すと問題ないんですね。
今回は、シェルの中から直接SQLを介して取り出しています。

補足日時:2011/10/26 14:04
    • good
    • 1

何をつかって、どう、PDFファイルを保存していますか?



たとえば、コンソールから、
SELECT BLOBのカラム名 FROM テーブル名 WHERE 一意のキー項目=キー値 INTO DUMPFILE "ファイル名"
とやっているとか

それとも、JavaとかPHPで保存する為のプログラムを自分で作ったのか。
プログラムを作ったのであれば、抽出しているところと、保存している部分の
コードを提示してもらわないとアドバイスできません。

あるいは、何かDBを操作するツールを使っているとか?
その場合、ツール名は何でしょうか?

この回答への補足

まず、保存ですが、これはjavaで作られたプログラムでpdfファイルを利用者がアップロードしてデータベースに登録しています。

今回は、その登録されているpdfファイルをシェルに直接SQLを書いて取り出そうとしています。なので、取り出す方法は、

select pdffile from a-table

としています。
pdffile カラムがblobカラムになります。

補足日時:2011/10/26 13:57
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

関連するカテゴリからQ&Aを探す