五、上傳圖像并使用asp.net 2.0數據源控件代碼存儲二進制數據
盡管ADO.NET方法工作在一個 ASP.NET 2.0應用程序環境下,但是,你還能夠使用ASP.NET 2.0的數據源控件來把二進制數據存儲到一個數據庫,這不要求你編寫ADO.NET代碼。在這個演示程序中所使用的SqlDataSource控件包含了 一個InsertCommand,以及相應于Title,MIMEType和ImageData值的參數:
<asp:SqlDataSource ID="UploadPictureDataSource" runat="server"
ConnectionString="..."
InsertCommand="INSERT INTO [Pictures] ([Title], [MIMEType], [ImageData]) VALUES (@Title, @MIMEType, @ImageData)">
<InsertParameters>
<asp:Parameter Name="Title" Type="String" />
<asp:Parameter Name="MIMEType" Type="String" />
<asp:Parameter Name="ImageData" />
</InsertParameters>
</asp:SqlDataSource>
注意,在此,ImageData參數并沒有指定一個類型。如果你試圖使用GUI向導來構建SqlDataSource的語法,那么,它 將可能給它指定Type="Object",然而,這個Type="Object"將會產生一個sql_variant類型的參數。然而,該 sql_variants類型不能用來存儲圖像或varbinary(MAX)數據類型,因為該sql_variant的內在數據大小不能超過8,000 個字節。(如果你試圖使用Type="Object",然后試圖保存超過8,000字節大小的二進制數據,那么,系統將拋出一個異常并顯示消息 "Parameter '@ImageData' exceeds the size limit for the sql_variant datatype";如果你試圖添加不到8,000字節大小的二進制數據,那么,該異常將顯示消息"Implicit conversion from data type sql_variant to varbinary(max) is not allowed")。
另外, DetailsView控件包含了兩個TemplateField。其中,一個TemplateField中使用一個TextBox控件來顯示標題欄;另 一個使用一個FileUpload控件來表示ImageData欄。最終結果是得到一個看上去類似于在"上傳圖像并使用ADO.NET代碼存儲二進制數據 "一節中的用戶接口。當點擊DetailsView的"Insert"按鈕時,它的Inserting事件激發,這時二進制數據必須從 FileUpload控件中獲取,讀到一個字節數組中,并且賦值給適當的參數:
PRotected Sub UploadPictureUI_ItemInserting(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.DetailsViewInsertEventArgs) Handles UploadPictureUI.ItemInserting
'引用FileUpload控件
Dim UploadedFile As FileUpload = CType(UploadPictureUI.FindControl("UploadedFile"), FileUpload)
'確保已經成功上傳一個文件
If UploadedFile.PostedFile Is Nothing OrElse String.IsNullOrEmpty(UploadedFile.PostedFile.FileName) OrElse UploadedFile.PostedFile.InputStream Is Nothing Then
...顯示錯誤信息...
e.Cancel = True
Exit Sub
End If
'確保我們在處理一個JPG或GIF文件
Dim extension As String = Path.GetExtension(UploadedFile.PostedFile.FileName).ToLower()
Dim MIMEType As String = Nothing
Select Case extension
Case ".gif"
MIMEType = "image/gif"
Case ".jpg", ".jpeg", ".jpe"
MIMEType = "image/jpeg"
Case ".png"
MIMEType = "image/png"
Case Else
'無效文件類型上載
... 顯示錯誤信息...
e.Cancel = True
Exit Sub
End Select
"指定MIMEType和ImageData參數的值
e.Values("MIMEType") = MIMEType
'把FileUpload的InputStream加載進字節數組中
Dim imageBytes(UploadedFile.PostedFile.InputStream.Length) As Byte
UploadedFile.PostedFile.InputStream.Read(imageBytes, 0, imageBytes.Length)
e.Values("ImageData") = imageBytes
End Sub
新聞熱點
疑難解答