• ベストアンサー

BLOB型のPDF出力の方法

BLOB型にPDFファイルが格納されているテーブルの列を、select文で抽出して、拡張子にpdfをつけてファイル出力したのですが、BLOBで定義している最大サイズで必ず出力されてしまいます。 pdf のファイルをテキストで開いてみると、エンド(%%EOF)以降が空欄でBLOBのサイズの大きさまで充填されていました。 BLOB型にPDFファイルを格納してある場合の出力方法はどうすればいいのでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
回答No.3

SELECTした結果をリダイレクトすると、桁揃えされてるので、 BLOBに限らずVARCHARもフル桁出力されちゃうと思います。 #1に書いたように、INTO DUMPFILEで1レコードずつ出力しましょう。

参考URL:
http://dev.mysql.com/doc/refman/5.1/ja/select.html#id595348
ichigo61
質問者

補足

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

その他の回答 (2)

  • nora1962
  • ベストアンサー率60% (431/717)
回答No.2

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); } } } でやって見ましたが再現しませんでした。

ichigo61
質問者

補足

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

回答No.1

何をつかって、どう、PDFファイルを保存していますか? たとえば、コンソールから、 SELECT BLOBのカラム名 FROM テーブル名 WHERE 一意のキー項目=キー値 INTO DUMPFILE "ファイル名" とやっているとか それとも、JavaとかPHPで保存する為のプログラムを自分で作ったのか。 プログラムを作ったのであれば、抽出しているところと、保存している部分の コードを提示してもらわないとアドバイスできません。 あるいは、何かDBを操作するツールを使っているとか? その場合、ツール名は何でしょうか?

ichigo61
質問者

補足

まず、保存ですが、これはjavaで作られたプログラムでpdfファイルを利用者がアップロードしてデータベースに登録しています。 今回は、その登録されているpdfファイルをシェルに直接SQLを書いて取り出そうとしています。なので、取り出す方法は、 select pdffile from a-table としています。 pdffile カラムがblobカラムになります。

関連するQ&A