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ファイルとして吐き出して、それを読み直してバイナリ化してる)
ちょっとパッと思いつかないので、次回にやってみよう!