上傳 (因為我還沒完成我的組件,不保證文章中的代碼的正確性.)
上傳多檔案
(Sander Duivestein)
介紹
這是我寫的一個上傳檔案的activex的組件.這個組件是使用winsocket 控制項調用FTP提交檔案.它僅僅工作在Ie3.02或更高的版本,但有些用戶端使用Netscape,因此不得不找另外的解決方案.但我搜尋 Internet 和若干新聞群組時,發現不止我一個有這樣的要求.
在1999.3.11, 看到啦Doug Dean的一篇15Seconds的文章(關於用VB asp 組件上傳檔案)給我啦一個很好的提示.
Doug Dean的組件簡單並且易用.但他說,然而,多元件的上傳問題沒解決?因而仍然有一些工作要完成.
在我開始做自己的組件以前,我想知道其他類似控制項提供什麼樣的功能.因此我看啦另外3個著名的組件:
the upload component of Software Artisans, the upload component of ASPUpload,
and the Microsoft Posting Acceptor.
通過比較這些組件我覺的我的組件應該滿足下列要求:
提交檔案的HTML表單對asp 組件應該是一黑盒子.也就是說組件能接受各種表單元件並能得到表單元件的名字和值.
它應能提供一個上傳路徑,並且限制大小.
組件應該能處理多個的檔案.
組件應該有一錯誤處理程式.
組件應該效能很好.
組件應該能在NC中象IE一樣工作.
儲存檔案進入資料庫.
僅允許某組用能上傳檔案.
這些對我來說是有相當的挑戰.
解決問題
首先我要建立一HTML檔案,它包含兩個元件:一簡單的文字框,一檔案框.這裡給出下列代碼:
1:Upload.htm
<HTML>
<HEAD><TITLE>Upload</TITLE></HEAD>
<BODY>
<FORM NAME="frmUpload" METHOD="Post" ENCTYPE="multipart/form-data" ACTION="Upload.asp"> <TABLE>
<TR><TD>Author</TD><TD><INPUT TYPE="text" NAME="txtAuthor"></TD></TR>
<TR><TD>File</TD><TD><INPUT TYPE="file" NAME="txtFileName"></TD></TR>
<TR><TD COLSPAN="2" ALIGN="right"><INPUT TYPE="Submit" VALUE="Upload"></TD></TR>
</TABLE>
</FORM>
</BODY>
</HTML>
使用ENCTYPE="multipart/form-data" 使表單能夠提交一檔案.我們也需要一檔案接收檔案.
2:Upload.asp
<%@ Language=VBScript %>
<%
Option explicit
Response.Buffer = True
On Error Resume Next
If Request.ServerVariables("REQUEST_METHOD") = "POST" Then
Dim objUpload
Dim lngMaxFileBytes
Dim strUploadPath
Dim varResult
lngMaxFileBytes = 10000
strUploadPath = "c:\inetpub\wwwroot\upload\"
Set objUpload = Server.CreateObject("pjUploadFile.clsUpload")
If Err.Number <> 0 Then
Response.Write "The component wasn't registered"
Else
varResult = objUpload.DoUpload (lngMaxFileBytes, strUploadPath)
Set objUpload = Nothing
Dim i
For i = 0 to UBound(varResult,1)
Response.Write varResult(i,0) & " : " & varResult(i,1) & "<br>"
Next
End If
End If
%>
在這裡設定下面兩個變數:
lngMaxFileBytes - 檔案最大位元組數, 和 strUploadPath -檔案上傳位置.我也增加了錯誤處理程式檢查是否裝入組件在網伺服器上適當註冊.這是我做的處理唯一的一個錯誤.如果任何另外的錯誤發生,可以再加入處理它.最後,再聲明varReturn.這變數用來接受組件的傳回值.這傳回值應該包含所有的表單元件名字和他們的值.你能看見FOR NEXT loop中的程式,這傳回值必須是一數組.
這是比較容易的部分.現在我們必須創造一ActiveX 組件,用來處理提交的表單.
開啟vb6,選擇一ActiveX 項目 (參閱步驟1:)
步驟1:
創造一ActiveX dll 項目
首先,先添加一個引用,在菜單條上選定添加引用項,選中
Active Server Pages Object library.(參閱步驟2).
步驟2:
工程引用
通過這個庫我們能使用asp的request的請求對象.為保證能使用,要用如下代碼:
Option Explicit
Private MyScriptingContext As ScriptingContext
Private MyRequest As Request
Private MyResponse As Request
Public Sub OnStartPage(PassedScriptingContext As ScriptingContext)
Set MyScriptingContext = PassedScriptingContext
Set MyRequest = MyScriptingContext.Request
Set MyResponse = MySriptingContext.Response
End Sub
為什麼我們需要ASP庫?通過request對象我們能得到由upload.htm傳來的http資料流.在那裡為什麼有一個 "但是"?當我們嘗試讀 表單欄位名字和相對的值,例如,Request.Form("txtTitle"), 但我們就不能讀出餘下的發送給我們的未經處理資料.因此我們使用Request.TotalBytes 和Request.BinaryRead 讀取發送的資料.
下面是我從Doug Dean得到的代碼:
'~~~~~ VARIABLES ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Dim varByteCount
Dim binArray() As Byte
'~~~~~ BYTE COUNT OF RAW FORM DATA ~~~~~~~~~~~~
&nb