建立自己的上传组件的编程思路 (转)

建立自己的上传组件的编程思路 (转)[@more@]

以前搜集的一些资料---如何建立自己的上传组件编程思路

关键词:ASP

在上次贴出的文章中我提到了几种上载组件的比较
现在我们自己动手,丰衣足食,来建立自己的上载组件
这个上载组件应该具备以下功能:
1。应该能够接受各种HTML的form元素中传过来的数值,而不
用知道是通过text或则select传过来的
2。应该能够给出一个上载路径
3。应该能够限制上载文件的大小
4。应该能够支持多个文件同时上载
5。应该能够处理异常错误
6。应该能够工作稳定
7。应该能够不厚此薄彼(即能够同时工作在IE和.NETscape中)
8。能够把文件保存在数据库
9。应该能够限制用户权限

代码和文件如下所示(老规矩,我就不作详细解释了)
1。UPLOAD.htm


Upload

RM NAME="frmUpload" METHOD="Post" ENCTYPE="multipart/form-data" ACTION="Upload.asp">
作者
文件






**注意:使用ENCTYPE="multipart/form-data"是为了能够让form提交一个文件

2。Upload.asp

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:inetpubwww rootupload"
 Set objUpload = Server.Create object("pjUploadFile.clsUpload")
 If Err.Number <> 0 Then
 Response.Write "组件没有 安装正确。"
 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) & "
"
 Next

 End If
End If
%>


现在使用 vb6开发这个 ActiveX 控件:(要注意的是,由于本人比较懒,中间有些代码可能不完整,
但重要的是要理解这个组件的编程思路)
1。引用Active Server Pages Object library.
2。代码如下:

Option Explicit

Private MyScriptingContext As ScriptingContext
Private MyRequest As Request
Private MyResponse As Request

Private Const ERR_NO_FILENAME As Long = vbObjectError + 100
Private Const ERR_NO_EXTENSION As Long = vbObjectError + 101
Private Const ERR_EMPTY_FILE As Long = vbObjectError + 102
Private Const ERR_FILESIZE_NOT_ALLOWED As Long = vbObjectError + 103
Private Const ERR_FOLDER_DOES_NOT_EXIST As Long = vbObjectError + 104
Private Const ERR_FILE_ALREADY_EXISTS As Long = vbObjectError + 105


Public Sub OnStartPage(PassedScriptingContext As ScriptingContext)
 Set MyScriptingContext = PassedScriptingContext
 Set MyRequest = MyScriptingContext.Request
 Set MyResponse = MySriptingContext.Response
End Sub

Private Function GetFileName(strFilePath) As String
 Dim intP os As Integer
 
 GetFileName = strFilePath
 For intPos = Len(strFilePath) To 1 Step -1
 If Mid(strFilePath, intPos, 1) = "" Or Mid(strFilePath, intPos, 1) = ":" Then
 GetFileName = Right(strFilePath, Len(strFilePath) - intPos)
 Exit Function
 End If
 Next 
End Function

Private Function CheckFileExtension(strFileName) As Boolean
 Dim strFileExtension As String

 If InStr(strFileName, ".") Then
 strFileExtension = Mid(strFileName, InStrRev(strFileName, ".") + 1)
 If Len(strFileExtension) < 3 Then
 CheckFileExtension = False
 Else
 CheckFileExtension = True
 End If
 Else
 CheckFileExtension = False
 End If 
End Function

Private Sub WriteFile(ByVal strUploadPath As String, ByVal strFileName As String, _
 ByVal lngFileLength As Long)

End Sub


Public Function DoUpload (ByVal lngMaxFileBytes As Long, _
 ByVal strUploadPath As String) As Variant

 Dim varByteCount As Variant
 Dim varHTTPHeader As Variant
 Dim lngFileLength As Long
 Dim arrError(0, 1) As Variant

 On Error GoTo DoUpload_Err
 varByteCount = MyRequest.TotalBytes
 varHTTPHeader = StrConv(MyRequest.BinaryRead(varByteCount), vbUnicode)
 MyResponse.Write varHTTPHeader

 Dim intFormFieldCounter As Integer
 intFormFieldCounter = Len(varHTTPHeader) - Len(Replace(varHTTPHeader, "; name=", Mid("; name=", 2)))

 ReDim arrFormFields(intFormFieldCounter - 1, 1) As Variant
 For i = 0 To intFormFieldCounter - 1
 lngFormFieldNameStart = InStrB(lngFormFieldNameStart + 1, varHTTPHeader, "; name=" & Chr(34)) 
 lngFormFieldNameEnd = InStrB(lngFormFieldNameStart + _
 Len(StrConv("; name=" & Chr(34), vbUnicode)), varHTTPHeader, Chr(34)) _
 + Len(StrConv(Chr(34), vbUnicode))
 strFormFieldName = Mi db(varHTTPHeader, lngFormFieldNameStart, lngFormFieldNameEnd - lngFormFieldNameStart)
 strFormFieldName = Replace(strFormFieldName, "; name=", vbNullString)
 strFormFieldName = Replace(strFormFieldName, Chr(34), vbNullString)
 If MidB(varHTTPHeader, lngFormFieldNameEnd, 2) = ";" Then
 lngFormFieldValueStart = InStrB(lngFormFieldNameEnd, varHTTPHeader, "filename=" & Chr(34)) 
 lngFormFieldValueEnd = InStrB(lngFormFieldValueStart + Len(StrConv("filename=" & Chr(34), vbUnicode)), varHTTPHeader, Chr(34))
 strFileName = MidB(varHTTPHeader, lngFormFieldValueStart, lngFormFieldValueEnd - lngFormFieldValueStart)
 strFileName = Mid(strFileName, InStr(strFileName, "=") + 2, Len(strFileName) - InStr(strFileName, "="))
 strFileName = Replace(strFileName, Chr(34), vbNullString)
 Else
 lngFormFieldValueStart = lngFormFieldNameEnd
 lngFormFieldValueEnd = InStrB(lngFormFieldValueStart, varHTTPHeader, varDelimeter)
 strFormFieldValue = MidB(varHTTPHeader, lngFormFieldValueStart, lngFormFieldValueEnd - lngFormFieldValueStart)
 strFormFieldValue = Replace(strFormFieldValue, vbCrLf, vbNullString) 
 lngFormFieldNameStart = lngFormFieldValueEnd
 End If
 arrFormFields(i, 0) = strFormFieldName
 arrFormFields(i, 1) = strFormFieldValue

 strFileName = GetFileName(strFileName)
 If Len(strFileName) = 0 Then
 Err.Raise ERR_NO_FILENAME
 End If
 If Not CheckFileExtension(strFileName) Then
 Err.Raise ERR_NO_EXTENSION
 End If
 lngFileDataStart = InStr(InStr(varHTTPHeader, strFileName), varHTTPHeader, vbCrLf & vbCrLf) + 4
 lngFileDataEnd = InStr(lngFileDataStart, varHTTPHeader, varDelimeter)
 lngFileLength = lngFileDataEnd-lngFileDataStart
 If lngFileLength <= 2 Then
 Err.Raise ERR_EMPTY_FILE
 End If

 If Not lngMaxFileBytes = 0 Then
 If lngMaxFileBytes < lngFileLength Then
 Err.Raise ERR_FILESIZE_NOT_ALLOWED
 End If
 End If
 If Not fs.FolderExists(strUploadPath) Then
 Err.Raise ERR_FOLDER_DOES_NOT_EXIST
 End If

 If fs.FileExists(strUploadPath & strFileName) Then
 Err.Raise ERR_FILE_ALREADY_EXISTS
 End If
 Set sfile = fs.CreateTextFile(strUploadPath & strFileName, True)
 sFile.Write varContent , lngFileDataStart, lngFileLength
 Close File
 sFile.Close
 Set sFile = Nothing
 Set fs = Nothing
 
 Next
 DoUpload = ""
 Exit Function
DoUpload_Err:
 arrError(0, 0) = "Error"
 Select Case Err.Number
 Case ERR_NO_FILENAME
 arrError(0, 1) = "没有输入需要提交的文件名。"
 Case ERR_NO_EXTENSION
 arrError(0, 1) = "文件扩展名出错。"
 Case ERR_EMPTY_FILE
 arrError(0, 1) = "你要上载的文件长度为0。"
 Case ERR_FILESIZE_NOT_ALLOWED
 arrError(0, 1) = "总共要上传 [" & lngFileLength &_
 "] 字节超过了允许的最大要求 [" &_
 lngMaxFileBytes & "]."
 Case ERR_FOLDER_DOES_NOT_EXIST
 arrError(0, 1) = "上传的目录不存在。"
 Case ERR_FILE_ALREADY_EXISTS
 arrError(0, 1) = "文件 [" & strFileName & "] 已经存在了。"
 Case Else
 arrError(0, 1) = Err.Description
 End Select
 DoUpload = arrError()
End Function

 

以前搜集的一些资料---有关文件上传组件的一些比较和说明

关键词:ASP

介绍现在比较常用的三种上载组件:
这三种组件都允许用户使用IE3.02以上和Netscape2.0以上版本上载文件
1。microsoft的 Posting Acceptor组件
该组件使用ISapi这个不用注册的DLL,FORM提交后发给这个dll,该组件
能够将文件写入指定目录,同时能够redirect到下一页面。
当然你必须要对写入的
目录具有写入的权限,所以一般用它在win95+pws下通过的程序一放到NT上来
就会出现错误,因为它不理解NT的权限和SSL机制。这就意味着不是所有的人都能够
随便上载文件甚至根本就没人能够上载文件。
其次,它不支持把文件写入到数据库中。所以如果你想拥有这个功能,你就需要
使用VB6来开发自己的组件。
再则,它的帮助少得可怜,你还不能够限制上载文件的大小,以及设置用户的权限
总之,它除了能够完成把文件保存下来的功能外一无是处。
2。Persits Software的 ASPUpload组件
这是一个功能很强大的COM组件,但如果要使用它的完全版需要交费。
它能够实现以下功能:
a.限制上载文件的大小
b.设置用户的权限
c.修改文件属性
d.同时上载多个文件
e.能够将文件保存到数据库中
f.支持文件删除,自动生成与服务器上文件不同名的文件
g.拥有管理权限的用户甚至可以使用该控件进行远程注册
3。Software Artisans的SA-FileUp 组件
这是最贵和功能最强大的文件上载组件了。
它的完全版本具备以下功能:
1。完整的文档,包括丰富的例子程序
2。给文件上载提供了完善的安全机制
3。使用ADO方式写入数据库,它还支持vb web class

总结如下:

Feature Posting Acceptor ASPUpload SA-FileUp
单用户 Free $99 $129
完全版 Free $300 $1,999
简单Form提交 Yes Yes Yes
多文件上传 No Yes Yes
和ASP结合程度 No Yes Yes
是否能够处理文件 No Yes Yes
是否支持数据库插入操作No Yes Yes
是否支持ADO NO Yes No
是否有对ACL的处理 No Yes Yes
是否支持对文件加密 No No Yes
是否支持自动安装 No No Yes
在线帮助 很少 充分 多方面的
例子程序 很少 一些 很多
在线帮助 很少 好 很好

建议:
1。如果你仅仅是想练手,可以使用Posting Acceptor
2.如果你要实现对网站的解决方案,使用ASPUpload或则SA-FileUp,当然你还
可以自己动手编程

 


来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/10790690/viewspace-953100/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/10790690/viewspace-953100/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值