创建文件上载站点
我已经建立了一个站点可以让用户上载文本文件或者GIF和JPG文件。而我不想使用基于COM的如SA-FileUp或者ASP上载,因为有太多的关于ISP的争论。我需要一个完全的ASP解决方案,所以我集成了Server
Behaviors(SB,服务器行为)、PureASP上载、TomSteemper(上载之前先预览文件)、动态包含文件、TomMuck(插入并获得ID)等等的优点。
自从有人想上载文件到我的站点,第一问题是跟踪上载上来的文件,所以我建立了一个数据库。在本例子中我使用了SQL 7而不是Access。以下是基本的设计。
区域名字 SQL数据类型 Access数据类型 注释
SubmitID int Autonumber 主键
AuthorName varchar (50) Text
Title varchar(50) Text
DateEntered Date Date
增加一个新的提交:Submit.asp
我假设你已经有一个正确的数据库连接。如果你使用UD4你不必为每一页做这件事情,但是它依耐于Connections.inc文件。首先创建一个表单,上面有你所需要的区域用于插入一个新的提交给你的数据库。现在应用TomMuck插入以及获得ID服务器行为。当你插入插入SubmitID,新插入记录的数值就会作为Session变量返回给网页,给它命名为SubmitID。相同的行为重定向我们到下一网页Upload.asp。具体如图1
所示。
(图1)
预览和上载你的文件:Upload.asp
在Upload.asp网页上,你首先需要创建一个表单,它看起来如图2所示。拖拉表单到网页上并且拖拉“Insert File Field”表单元素到网页上。在其上方增加一些文本说明用户应该如何做。你可能会注意到我将新的SubmitID数值作为一个Session变量并且将它作为一个基准文件。所以如果SubmitID是100,那么所有上载的文件都命名为100,比如100.txt、100.gif等等。这就意味这我可以判断哪个文件来自哪个人,并且避免了文件的覆盖,因为不同的用户有不同的名字。
(图2)
现在选择表单并应用PureAsp上载行为。你将可以看到这个对话框,在上面你可以设置各种参数。我想让用户只能上载txt、gif、或者jpg扩展名的文件,所以我键入逗号分隔的列表,如图3所示。
(图3)
自此我已经有了可以完成真正文件上载的代码。下面我要让用户在上载之前先预览一下文件。你可以先看看TomSteemper的教程:
http://members.prestige.net/ultradev/upload/upload.htm 下载这个文件。
首先让我们先看看Tom的choose_upload.asp网页。你会发现这个网页是由两段代码组成的。第一段是Javascript代码用于在窗口中打开一个新的网页。以下是具体的代码。你可以将剪切它并粘贴到Upload.asp网页代码的<
/head >之前。
< script language="JavaScript" >
< !--
function T3_OpenWindow(url,name,features) {
window.open(url,name,features);
}
//--
< /script >
< /head >
第二段代码是在表单上,它是附载按钮上的。它只是简单地增加按钮给表单。并且改变Action(动作)为None,然后打开网页地代码视窗,为按钮增加代码:
onClick = "T3_OpenWindow('preview.asp?file1=' +
document.form1.file1.value,'preview','scrollbars=yes,resizable=yes,width=400,height=200')"
>
假设你的表单的名字为form1并且文件区域表单元素的名字为file1。所以所有的为预览你的文件按钮的代码如下:
< input type="button" name="Button"
value="Preview" onClick = "T3_OpenWindow('preview.asp?file1=' +
document.form1.file1.value,'preview','scrollbars=yes,resizable=yes,width=400,height=200')"
>
当你按下Browse(浏览)按钮的时候你可以浏览你的硬盘并选择一个文件显示载文件区域表单元素上。当你按下预览你的文件按钮,它就打开一个新的网页Preview.asp。现在让我们看看TomSteeper的其它文件Preview.asp。在上面他将文件的位置作为一个Request(请求)数值传递给Upload.asp并给文件的路径赋值。如果文件有gif或者jpg扩展名字,那么他就设置图象的来源为文件名字,而图片则显示在新的窗口。
既然我也考虑到了txt文件,我想让用户也可以浏览文本文件,因为任何的浏览器可以显示文本。现在我想利用动态包含文件行为来应用到网页上。图4的对话框是用来增加行为的。可以选择Server.MapPath和浏览器来选择任何老的文件。然后键入文件的名字来重定向看是否文件被找到。我选择了nofile.htm。因为代码不会被调用,所以无关紧要。如果它们找到了文件路径,用户可以浏览他们硬盘的文件。
(图4)
现在你需要移动新的代码,因为插入到了TomSteeper预览代码的前面,需要把它移动到TomSteeper代码后面。代码中有一段OP_txtfile =
Server.MapPath(Default.asp)使用了Server.MapPath来找文件的位置。但是我们已经知道文件的位置因为从其它的网页已经将它作为一个请求传递过来了。实际上文件的位置已经存在在TomSteeper代码的变量FullPath=Request("file1")所以让我们用with
OP_txtfile = FullPath来替换上面的行。
TomSteeper的代码中有调用图象预览的语句(< img src="< %=
FullPath % >" >)。将这条语句拷贝下来并修改它使它可以使用于txt文本文件扩展名。不是设置图象的来源给TomSteeper代码,我在表格中设置给动态包括代码:<
%=OP_incfile% >.
我同时也修改了TomSteeper代码,所以它可以重定向到文件路径。如果文件类型不是一个可以接受的扩展名(txt,gif,jpg)就显示一个错误的消息。请记住,你页可以在PureASP上载行为设置可以接受的文件扩展名。你可能想允许用户上载一个ZIP文件,但是不想显示它。所以在你的应用程序中要解决两个问题:文件类型的在载和文件类型的预览。提供号的指导和错误信息对于避免困惑用户是至关重要的。以下是具体代码:
< %@LANGUAGE="VBSCRIPT"% >
< % Response.buffer = true % >
< !--This combines the Tom Steeper Preview Code with Owen Palmer's Dynamic
Include -- >
< %
FullPath=Request("file1")
SplitPath=Split(FullPath,"\")
FileName=Ubound(SplitPath)
FileName=SplitPath(FileName)
ExtensionSplit=Split(FileName,".")
Extension=Ubound(ExtensionSplit)
Extension=ExtensionSplit(Extension)
% >
< %
'UltraDeviant - Dynamic Include written by Owen Palmer
(http://ultradeviant.co.uk) - VBScript code written by Dave Long
(teq@tweekers.com) - RC Changes remove OP_txtfile = Server.MapPath(Default.asp)
and replace with OP_txtfile = FullPath
Dim OP_txtfile
Dim OP_fso
Dim OP_incfile
Dim OP_thefile
OP_txtfile = FullPath 'FilePath
Set OP_fso = CreateObject("Scripting.FileSystemObject")
if OP_fso.FileExists(OP_txtfile) then
Set OP_thefile = OP_fso.OpenTextFile(OP_txtfile,1)
OP_incfile = OP_thefile.ReadAll
OP_thefile.Close
Set OP_fso = Nothing
Set OP_thefile = Nothing
else
nofile.htm 'If file does not exist
end if
% >
some other code on the page and then...
< % IF Extension = "gif" OR Extension = "jpg" THEN
% >
< table width="100%" border="0"
cellspacing="0" cellpadding="0" height="100%"
>
< tr >
< td >
< div align="center" >< img src="< %= FullPath %
>" >< /div >
< /td >
< /tr >
< /table >
< % END IF% >
< !--RC Changes remove < img src="< %= FullPath % >" >
and replace with < %= OP_incfile % >-- >
< % IF Extension = "txt" OR Extension = "htm" OR
Extension = "html" OR Extension = "shtm" OR Extension =
"shtml" THEN
% >
< table width="100%" border="0"
cellspacing="5" cellpadding="5" height="100%"
>
< tr >
< td >
< %=OP_incfile% >
< /td >
< /tr >
< /table >
< % END IF% >
< !--RC Changes - redirect to Error Message if the wrong file type-- >
< % ELSE % >
< table width="100%" border="0"
cellspacing="5" cellpadding="5" height="100%"
>
< tr >
< td >
< div align="center" >< h4 >Sorry, only GIF, JPG, TXT,
HTM, HTML, SHTM, or SHTML files can be displayed< /h4 >< /div >
< /td >
< /tr >
< /table >
< % END IF % >
现在你只需要再增加一段代码就可以大功告成了。如果你想运行预览,你将得到一个HTTP错误页眉(上面写着错误信息)。为了改正这个错误,你必须再网页的上方增加如下代码,这条语句是迫使在任何东西被回传之前先执行整个网页。
< % Response.buffer = true % >
本教程我在编写代码的时候综合了Server Behaviors(SB,服务器行为)、PureASP上载、TomSteemper(上载之前先预览文件)、动态包含文件、TomMuck(插入并获得ID)等等的特点。这些代码实现了以下一些功能:在上载之前预览一下图象的类型,在预览窗口中打开其它txt文本文件类型。
最后给出本文应用到的服务器行为(SB)的下载地址:
服务器行为 下载地址
PureASP上载 http://www.udzone.com/
上载之前先预览文件 http://members.prestige.net/ultradev/
动态包含文件 http://www.ultradeviant.co.uk/
TomMuck(插入并获得ID) http://www.ultrasuite.com/us/