javaでExcelをBlobに変換して保存、DBから読み込んでファイル出力してみる!


Webアプリでファイルをダウンロードするとき・・
ファイルサーバを立てるのが真っ先に思いつくけど、こんな方法も・・
(サイズは気にしないことにする。)

1.ファイルを読み込む

main
// ファイル読み込み
File uploadFile = new File("[ディレクトリ]\\tmp.xlsx");
FileInputStream finstream = new FileInputStream(uploadFile);

いたってシンプル。

2.DBに保持する

main
Class.forName("oracle.jdbc.driver.OracleDriver");
// Oracle8iに接続
Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:TEST", "system", "password");
// ステートメントを作成
Statement stmt = conn.createStatement();
// SQL定義
PreparedStatement pstmt = conn.prepareStatement("INSERT INTO [スキーマ].test_table(file_id, deta) VALUES(0, ?)");
// ステートメントにバインド
pstmt.setBinaryStream(1, finstream, (int) uploadFile.length());
// 実行
int result = pstmt.executeUpdate();

setBinaryStreamでバイナリ化してセットする。

3.DBからバイナリデータを取り出す

main
// バイナリデータ取得
ResultSet rset = stmt.executeQuery("select deta from [スキーマ].upload_file where file_id = '0'");
// Blobデータを取得してファイルに出力
Blob blob = null;
while (rset.next()) {
    blob = rset.getBlob("deta");
}
byte[] buffer = blob.getBytes(1, (int) blob.length());

getBytesでbyte配列に格納

4.ファイルに吐き出す

main
// 出力ファイルを指定
File file = new File("[ディレクトリ]\\test001_output.xlsx");
DataOutputStream dos = new DataOutputStream(new FileOutputStream(file));
// byte配列を書き込む
dos.write(buffer);
dos.close();

シンプルにファイルを生成して書き込む。

5.お決まりのクローズ処理

main
// 結果セットをクローズ
rset.close();
// ステートメントをクローズ
stmt.close();
// 接続をクローズ
conn.close();

// tmpファイル削除
uploadFile.delete();

各種クローズ。と、アップロードしたtempファイルを削除。
指定したディレクトリにファイルが生成される。

6.課題

前回POIを使ってExcelを生成したけど、
ファイル生成処理とバイナリ化してDBに保持を同じフローでやりたい・・
(一回tempファイルとして吐き出して、それを読み直してバイナリ化してる)

ちょっとパッと思いつかないので、次回にやってみよう!