国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

用ASP.NET2.0在數據庫中存儲二進制文件(二)

2019-11-18 16:28:46
字體:
來源:轉載
供稿:網友

  五、上傳圖像并使用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 

  就象前面的"Insert"按鈕的Click事件處理器一樣,該DetailsView的Inserting事件處理器也執行相同的邏 輯-只有一些小小的語法差別。首先,既然FileUpload控件位于一個

  檢查完之后,MIMEType和ImageData參數將被使用e.Values("parameterName")=value語法進行賦值。就象在前面的ADO.NET示例中一樣,首先把該二進制數據讀取到一個字節數組中,然后把該字節數組賦值給該參數。

  六、 顯示二進制內容

  無論你使用什么技術把數據存儲在數據庫中,為了檢索并顯示二進制數據,我們需要創建一 個新的ASP.NET頁面。這個名字為ShowPicture.aspx的頁面,將通過querystring把一個PictureID傳遞給它,并且從 指定的產品的ImageData域中返回該二進制數據。一旦完成,通過訪問/ShowPicture.aspx?PictureID=picutreID 地址即可看到一個特定的圖片。因此,為了把一個圖像顯示在一個web頁面上,我們可以使用一個圖像控件并把它的ImageUrl屬性設置成適當的URL。

   注意,這個ShowPicture.aspx在其.aspx頁面中并沒有包括任何HTML標記。在code-behind類的Page_Load事件處 理器中,將使用ADO.NET代碼從數據庫中檢索指定的Pictures行的MIMEType和ImageData。然后,該頁面的 ContentType被設置為MIMEType域的值,并且使用Response.BinaryWrite(ImageData)輸出該二進制數據:

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
 Dim PictureID As Integer = Convert.ToInt32(Request.QueryString("PictureID"))

 '與數據庫連接并且返回指定的圖片的圖像內容和MIME類型
 Using myConnection As New SqlConnection(ConfigurationManager.ConnectionStrings("ImageGalleryConnectionString").ConnectionString)

 Const SQL As String = "SELECT [MIMEType], [ImageData] FROM [Pictures] WHERE [PictureID] = @PictureID"
 Dim myCommand As New SqlCommand(SQL, myConnection)
 myCommand.Parameters.AddWithValue("@PictureID", PictureID)

 myConnection.Open()
 Dim myReader As SqlDataReader = myCommand.ExecuteReader

 If myReader.Read Then
  Response.ContentType = myReader("MIMEType").ToString()
  Response.BinaryWrite(myReader("ImageData"))
 End If

 myReader.Close()
 myConnection.Close()
 End Using
End Sub


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 大余县| 丰台区| 南充市| 丰宁| 嘉祥县| 罗田县| 大同县| 阆中市| 蓬安县| 栾川县| 长春市| 朝阳区| 丰宁| 增城市| 嘉祥县| 东乡族自治县| 松原市| 扶余县| 新乡县| 临海市| 谷城县| 临高县| 加查县| 陇南市| 渭南市| 南陵县| 晋宁县| 新田县| 洪泽县| 金沙县| 新沂市| 伊吾县| 德安县| 光泽县| 永福县| 洞头县| 溆浦县| 长兴县| 柳林县| 贵德县| 辉县市|