2007年11月1日 星期四

如何在ASP.NET中上傳檔案到資料庫

上回談到了如何下載檔案,包含資料庫中的檔案,動態產生的檔案...等。
這次我們來看看怎麼把檔案上傳到資料庫中,這邊需要注意一個小地方,在上傳檔案到資料庫的部分,資料欄位的性態若是Access請選擇Ole物件,若是SQL Server請選擇Image格式。

接著您可以透過底下的程式碼進行檔案的上傳:

If Me.FileUpload1.PostedFile.ContentLength > 0 Then
  Dim cn As New Data.OleDb.OleDbConnection
  Dim dc As Data.OleDb.OleDbCommand
  Dim para As Data.OleDb.OleDbParameter
  Dim SQL, FileName As String
 
 '連線字串
  cn.ConnectionString = Me.AccessDataSource1.ConnectionString
  cn.Open()
  
'執行 TextBox 中的 SQL 指令
  FileName = Me.FileUpload1.PostedFile.FileName
  SQL = "insert into FileStorage (FileName,FileBody) values ('" & FileName & "',?)"
  
'建立 SqlCommand 物件
  dc = New Data.OleDb.OleDbCommand(sql, cn)
  para = New Data.OleDb.OleDbParameter("file", Data.OleDb.OleDbType.Binary)
  para.Value = Me.FileUpload1.FileBytes
  dc.Parameters.Add(para)
  
'執行(透過 Parameters 將檔案儲存到資料庫)
  dc.ExecuteNonQuery()
  ShowAlertMsg("上傳檔案儲存完畢!")
Else
  ShowAlertMsg("上傳檔案不存在!")
End If


  上傳至資料庫中的檔案,可以透過底下的方式重新下載回來,請特別這注意這張網頁在叫用的時候必須提供檔案編號做為URL中的命令列參數:

  Me.AccessDataSource1.SelectCommand = "select * from FileStorage where uid=" & Request.QueryString("FileID")
  Dim dv As Data.DataView = Me.AccessDataSource1.Select(New DataSourceSelectArguments)
  
'準備下載檔案
  Response.ClearHeaders()
  Response.Clear()
  Response.Expires = 0
  Response.Buffer = True
  Dim fileName As String = dv.Item(0).Item("FileName")
  
'透過 Header 設定檔名
  Response.AddHeader("content-disposition", "attachment; filename=" & Chr(34) & System.Web.HttpUtility.UrlEncode(IO.Path.GetFileName(fileName), System.Text.Encoding.UTF8) & Chr(34))
  Response.ContentType = "Application/octet-stream"
  
'傳出要讓使用者下載的內容
  Response.BinaryWrite(dv.Item(0).Item("FileBody"))
 
 '釋放資源
  Response.End()


整個範例請參考:
http://video.studyhost.com/Download/Example/ASP.NET/FileUploadAndDownloadWithDB.rar

6 則留言:

Justin 提到...

太感謝你了, 雖然你的code我不太了解,但是例子非常好用,真幸運有找到你,謝謝!

lyg 提到...

感謝你提供很好的範例程式, 我已經下載執行過了, 程式碼再研究看看, 希望能學會. 也希望你能多多提供這方面的資訊 ^^

大俠 提到...

最近正在學習ASP.NET 2.0
雖然您這的資料還不算多..
不過卻很有幫助..
希望您能多多分享更多ASP.NET的教學..
感謝您的分享!!

小玉兔 提到...

上載檔案好好用
但其實我是想知 上載完之後,

怎樣才能讓人好像 論壇 那樣
即時可以看到已上載的東西?

我想即時在網頁附加 上載的物件

我開 download.aspx 傳回了錯誤

查詢運算式 'uid=' 中的 語法錯誤 (少了運算元)。
行 7: Dim dv As Data.DataView = Me.AccessDataSource1.Select(New DataSourceSelectArguments)

沒有複製 web.config 有關嗎?
因為我原來已有, 怕取代會發生問題

匿名 提到...

請問上傳後的檔案跑去那裡了呢?網頁資料夾裡都沒有。

匿名 提到...

你好

此範例必須提供檔案編號做為URL中的命令列參數

我想要以檔名作為URL參數,但是我是了很多次都無法成功,在此想請教該如何做修改呢