打印本文 打印本文 关闭窗口 关闭窗口
建立自己的上传组件的编程思路
作者:武汉SEO闵涛  文章来源:敏韬网  点击数2027  更新时间:2009/4/23 18:58:51  文章录入:mintao  责任编辑:mintao

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

关键词:ASP

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

代码和文件如下所示(老规矩,我就不作详细解释了)
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>作者</TD><TD><INPUT TYPE="text" NAME="txtAuthor"></TD></TR>
<TR><TD>文件</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"是为了能够让form提交一个文件

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 "组件没有安装正确。"
    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
%>


现在使用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 intPos 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 = MidB(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
  &nbs

[1] [2]  下一页

打印本文 打印本文 关闭窗口 关闭窗口