精华区 [关闭][返回]

当前位置:网易精华区>>讨论区精华>>编程开发>>● ASP>>参考文档>>用浏览器上载和下载数据库中的BLOB域(二)

主题:用浏览器上载和下载数据库中的BLOB域(二)
发信人: nightcat()
整理人: (1999-07-22 12:14:18), 站内信件
Downloading and Uploading BLOBs to a SQL Database Using a Browser
Part II of II
By Pieter Reint Siegers Kort

In Friday's article I looked at a way to download BLOBs from a 
SQL Server database to remote machines for editing work, as 
well as the necessary tools and languages. (Part 1should you 
need to refer back to it for that information.) Today, I'm 
going show you how to upload the disk image to the SQL database,
which is a bit more complex because of the necessary preparation 
of the bytes. The order of events will be:

first, an ActiveX control is used to fill an ASP variable with 
the bytes of the file on disk 
then, through ADO, a parameter object is created and filled. 
This will be passed to an ADO command object 
the rest of the SQL table fields will be assigned proper values 
and finally, a SQL Stored Procedure will be executed in order to 
store the new record in the table. 
While it is entirely possible to add a method to the already 
existing client component that will transfer the image bytes to 
the Web server, I have chosen to create a server-side component 
instead. This makes sense to me primarily because the byte 
preparation is carried out using an ASP page, which runs on the 
server, but also because it gives me the opportunity to do the 
processing on the server-side. 

The component is called GenPrevPC, and has the public method 
FillPreview()which looks like this:

Public Function FillPreview(ByVal PathPreview As String) As Variant
  
  ' declarations
  Dim Fnum As Integer
  Dim LenImage As Long
  Dim ContPreview() As Byte
   
  ' open preview file and read its content (path is UNC)
  Fnum = FreeFile
  Open PathPreview For Binary Access Read As Fnum
   
  ' determine length of image
  LenImage = LOF(Fnum)
   
  ' redim array of bytes
  ReDim ContPreview(LenImage)
   
  ' read bytes
  Get Fnum, , ContPreview
   
  ' and close the file
  Close Fnum
   
  ' return the result (assign to function name)
   FillPreview = ContPreview
   
End Function
The file is accessed using a UNC path. The length of the file 
is determined using the function LOF(Fnum). Then the bytes are 
assigned to the array variable ContPreview. The function 
declaration As Variant allows us to return the result to the 
function name - an action performed by the code phrase 
FillPreview = ContPreview at the end of the function.

Let抯 have a look at the part of the ASP page calling the 
component抯 method FillPreview(). The whole lot looks like 
this:

<%
' retrieving the physical path to the image file
PathUNC = Server.MapPath(Trim(Request.Form("URLFoto")))

' convert to UNC if path type is DOS (local)
if InStr(1,PathUNC,"\\") = 0 then
PathUNC = "\\" & Trim(Request.Form("ServerFoto")) & Mid(PathUNC,3)

end if

' creating the destination UNC path using PathUNC to dinamically obt
ain the filename
PathPreview = "\\" & Trim(ServLocal) & "\FotoEditor6\Previstas\" & R
ight(PathUNC,Len(PathUNC)- InStrRev(PathUNC,"\"))

' create an instance of GenPrevPC.dll at the server
Set GenPrevPCi = Server.CreateObject("GenPrevPC.GenPC")

' copy the image to a local folder
GenPrevPCi.CopyImage PathUNC,PathPreview

' assign contents and length of the binary file to an ASP variable
ContPreview = GenPrevPCi.FillPreview(PathPreview)

' liberate resources
Set GenPrevPCi = nothing
%>
Some of these lines of code are more significant than others - 
the first one to examine in detail is the first line itself:

PathUNC = Server.MapPath(Trim(Request.Form("URLFoto")))
This will forge the absolute path to the image. When the path 
is in the URL format, it must be converted to a Universal 
Naming Convention (UNC) path. UNCs are paths which point to a 
computer using its NetBios name instead of a drive name (which 
is done in normal DOS paths): for example \\servername\temp\x.jpg. 
UNCs allow us to access computers without having to map the drive 
on the accessing computer (in this case, the Web server). The next 
line of code assures that the path is a UNC: if not (if, for 
example, the URL is local), it will be converted to a valid UNC 
path using the local Web server name. After that, the destination 
path is created next using the PathUNC variable. 


This line instantiates the COM component at the server:

Set GenPrevPCi = Server.CreateObject("GenPrevPC.GenPC")
After which, the image is copied to a local folder, making all 
the necessary data available locally. PathPreview is the 
destination path, and points to a local directory on the Web 
server:

GenPrevPCi.CopyImage PathUNC,PathPreview
The variable ContPreview is filled with the bytes from the disk 
by calling the component抯 method FillPreview. Note that a VB 
Byte Array is used to return the bytes, and then assigned to 
the function name (a fairly common way to return data in VB):

ContPreview = GenPrevPCi.FillPreview(PathPreview)
Finally, the really interesting bit: it is possible to upload 
an image in just one pass to the SQL database table, along with 
the other field values, using the ADO Parameter object. First, 
the parameter object is created:

Set objParPrev = Server.CreateObject("ADODB.Parameter")
And then its properties filled in:

objParPrev.Name = "@Preview"
objParPrev.Type = adLongVarBinary    '(NOTE: use adLongVarChar for tex
t BLOBs)
objParPrev.Attributes = adParamLong
objParPrev.Size = LenB(ContPreview)
objParPrev.Value = ContPreview
Of which the Name property is the SQL table column name, 
prefixed with @. The Type property for images is of type 
adLongVarBinary, which correlates to the image data type in 
SQL. The Attributes property is assigned the value adParamLong, 
which indicates that the parameter object accepts long binary 
data. The Size property is assigned the byte size of the image 
file in question, using the function LenB. And last of all, the 
image bytes are assigned to the Value property.

It's time to put the pieces together. Now that the parameter 
object is created and properly assigned with values, we can 
continue to prepare the rest of the fields of the SQL table: 

<%' create the parameter object:
Set objParPrev = Server.CreateObject("ADODB.Parameter")
objParPrev.Name = "@Preview"
objParPrev.Type = adLongVarBinary '(use adLongVarChar for text BL
OBs)
objParPrev.Attributes = adParamLong
objParPrev.Size = LenB(ContPreview)
objParPrev.Value = ContPreview

' assign SP name
objCmd.CommandText = "UploadImage2SQL"

' agregating parameters
objCmd.Parameters.Append objCmd.CreateParameter("RETURN_VALUE", adIn
teger,adParamReturnValue, 4)
objCmd.Parameters.Append objCmd.CreateParameter("@id", adInteger, ad
ParamInput, 4, CLng(id))
objCmd.Parameters.Append objParPrev

' execute the SP
objCmd.Execute

' return the result of execution
objCmdReturn = CInt(objCmd(0))

' close the object to free resources
set objParPrev = nothing %>
Finally the query is executed against SQL and the image is 
inserted into the database table. A RETURN_VALUE is included 
in order to receive information about the result of the query. 
This can be manipulated by server- or client- side script. 
This code excerpt would generate an error message in the case 
of failure, for instance: 

CREATE PROCEDURE UploadImage2SQL
@id int,
@Preview image=null
AS
set nocount on
insert Images
values(@id,@Preview)
return
The procedure inserts the image bytes into the image field 
Preview together with its assigned id.

The SQL table can be created, executing the following script 
in the Query Tool of SQL 6.5 (or use Visual InterDev 6 and 
create a new procedure):

CREATE TABLE dbo.IMAGES (
id int NOT NULL,
Preview image NULL
)
  
GO
It is possible to add any type of field to this table.


Conclusion

In the two parts to this article I have tried to demonstrate 
how (relatively) easy it is to download and upload BLOBs to 
a SQL database table using a Web browser. The code samples 
given are not meant to give a complete solution, but should 
serve as a guide to develop a more complete web site which 
both takes advantage of the technologies available, and also 
integrates them.

There are other ways of uploading and downloading images. The 
solution I've shown here is taken from a real world application, 
and is not necessarily always the best one. Some important 
things to think about when you're choosing your optimal solution 
are:

Internet security issues, as ever, like file protection and 
database security - you might consider firewalls, and anonymous 
user access which allows you more control. 
Limiting your audience through browser type and version 
restrictions. 
Even if your audience has appropriate browser types and 
versions, their preferences can still influence the functionality 
of your applications because you抮e using ActiveX. They need to 
allow ActiveX controls to be downloaded, installed, and run on 
their machines, by adapting the settings of the browser 
preferences. 

-----------------------------------------------------------------

--
※ 来源:.月光软件站 http://www.moon-soft.com.[FROM: 202.103.124.22]

[关闭][返回]