ASP.NETでアップロードされたファイルを、DBに格納する方法のメモ。
開発をしていて、データの保存場所に困ることがある。
フォルダにそのまま格納しておくと分散が大変とか、
ファイルの管理が大変とか、いろいろな悩みがあるだろう。
その時の選択肢としてよく上がるのが、DBをストレージとして使う方法だ。
ファイルとしてフォルダに置くのではなく、DBに格納し必要な時にSQLで取り出す。
データはDBに保存してあるので、DBのバックアップを取っておけばOK。
DBのパフォーマンスは気になるが、選択肢としてあるだろう。
そんなとき、ASP.NETでアップロードされたファイルを直接DBに保存する。
ファイルとしてサーバ上に置かなくていいので、ゴミもできない便利な方法だ。
■画面側
まず、ASPX側にはFileUploadコントロールを配置する。(これのIDはFileUpload1とする)
これで、ファイルを指定するボタンとファイルが指定されるテキストボックスができる。
■VB側の処理
FileUploadコントロールのPostedFile.InputStreamメソッドでアップロードされたファイルを
Streamオブジェクト(バイトデータ)として読み込むことができる。
ただ読むことができる、いってもそのままDBに格納できるわけではないので、
一度、変数に読み取ったバイトコードを格納し、それをSQLパラメータにいれる。
わかってしまえば、どうということはない処理だ。
■サンプルコード
Try
'SQL Connectionの作成(参考:マスタページ側で処理してる)
Dim dbCon As SqlConnection = New SqlClient.SqlConnection
dbCon.ConnectionString = ConfigurationManager.ConnectionStrings("DBconnect").ConnectionString
dbCon.Open()
'Transactionの作成(参考:マスタページ側で処理してる)
Dim dbTrans As SqlTransaction
dbTrans = dbCon.BeginTransaction(IsolationLevel.ReadCommitted)
'DBには、VarBinary型もしくはimage型のFileDataというカラムがある想定
Dim sql As String = "INSERT INTO FileStorage (FileData) VALUES (@file)"
Dim command As SqlCommand = New SqlCommand(sql, dbCon, dbTrans)
'Byteデータとしてアップロードされたファイルを読み込む
Dim binaryData(FileUpload1.PostedFile.InputStream.Length) As Byte
FileUpload1.PostedFile.InputStream.Read(binaryData, 0, FileUpload1.PostedFile.InputStream.Length)
command.Parameters.Add("@file", SqlDbType.VarBinary).Value = binaryData
'SQLの実行
Dim result As String
result = command.ExecuteNonQuery()
'SQL Connectionを閉じる。
dbCon.Close()
Catch ex As Exception
dbCon.Close()
Response.Write("失敗。。。")
End Try