王朝网络
分享
 
 
 

用ASP.NET2.0在数据库中存储二进制文件(二)

王朝asp·作者佚名  2008-05-31
宽屏版  字体: |||超大  

五、上传图像并使用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控件位于一个模板内,所以,必须使用FindControl("controlID")方法 以编程方式来引用它。一旦对它进行了引用,即对之进行相同的检查以确保一个文件被成功上传,并且允许相应的扩展名。对于DetailsView的 Inserting事件处理器存在一个微小的区别是,如果出现了错误,那么,我们需要通知该DetailsView停止相应的插入工作-这是通过把 e.Cancel属性设置为True实现的。

检查完之后,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

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
>>返回首页<<
推荐阅读
 
 
频道精选
 
静静地坐在废墟上,四周的荒凉一望无际,忽然觉得,凄凉也很美
© 2005- 王朝网络 版权所有