如何建立自己的上传组件的编程思路

转载 2004年07月17日 16:23:00

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

关键词: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
            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,当然你还
可以自己动手编程

 

文件上传的一些思路

前言   最近在玩IOS,学习到文件上传的一些东西略有感悟,其实文件上传也是使用http协议,只是报文体部分的数据比较难拼,只要分析清楚了完全可以自己去实现文件上传组件。 1文件上传...
  • u013206465
  • u013206465
  • 2015年12月03日 12:02
  • 565

基于组件的开发思路

转载至:http://chinese-darren.iteye.com/blog/1845551 1. 4个基本特性:组件,组件之间的协同,组件插座,组件的使用者。 2. 高度的以体系结构...
  • aly1989
  • aly1989
  • 2016年11月06日 20:50
  • 660

Java 文件上传和下载组件的设计与实现...【Pnoter】

通用 Java 文件上传和下载组件的设计与实现...【Pnoter】 件上传和下载是 Web 应用中的一个常见功能,相信各位或多或少都曾写过这方面相关的代码。但本座看过不少人在实现上传或下载功能时总是...
  • Pnoter
  • Pnoter
  • 2015年02月15日 16:26
  • 1618

vue组件库开发-环境搭建-npm上传

本文含有以下章节: vue组件库开发 环境搭建-本地预览开发环境 环境搭建-组件打包环境 环境搭建-单独css打包配置 vue组件库开发组件库开发的目的:现在公司小项目可能会比较多,虽然用的eleme...
  • mr_zhuqiang
  • mr_zhuqiang
  • 2017年07月26日 16:39
  • 1284

给初学编程解题没思路的学生的建议

一个通过评论完成的答疑——学生:老师,最近一直用您的C++程序设计课程学习和练习,老师给的答案详细明了,很容易懂,但是有些在自己写的时候很难想到,尤其是像类似于本文程序中对“输入的时间d天后是哪年哪月...
  • sxhelijian
  • sxhelijian
  • 2013年10月12日 16:14
  • 5196

通用 Java 文件上传和下载组件的设计与实现

概 述   文件上传和下载是 Web 应用中的一个常见功能,相信各位或多或少都曾写过这方面相关的代码。但本座看过不少人在实现上传或下载功能时总是不知不觉间与程序的业务逻辑纠缠在一起,因此,当其他...
  • youyou_yo
  • youyou_yo
  • 2015年07月23日 18:06
  • 1421

iOS组件封装的思路和实现

前两天面试了一个应聘者,他的演示项目里有广告轮播功能。恰好之前我封装过一个实现了此功能的控件,于是就顺着他广告轮播的实现一直往下聊,从需求的抽象一直聊到各种实现的细节和需要考虑的问题等等。组件的封装是...
  • AlexAoMin
  • AlexAoMin
  • 2016年04月26日 12:32
  • 414

几种上传文件组件的性能比较

近两天来由于项目需要使用上传组件,于是我仔细分析了Cos和FileUpload的源代码,并对它们的性能进行了测试比较,使用2M、20M、45M、200M的上传大小测试三种组件所花费的时间(单位为ms)...
  • alisafreya
  • alisafreya
  • 2013年08月13日 10:26
  • 1290

JAVA编程思路的锻炼

1、 有必要知道什么是程序,什么是算法。 你知道它是什么,便不会学得懵懵懂懂。 学习java编程跟学习其他编程语言一样,都需要明白这是一种解决问题的语言表达形式。 通过这种计算机语言描述出...
  • Learners_wj
  • Learners_wj
  • 2016年10月11日 15:43
  • 2204

前端常用组件-文件上传组件

Web Uploader WebUploader是由Baidu WebFE(FEX)团队开发的一个简单的以HTML5为主,FLASH为辅的现代文件上传组件。在现代的浏览器里面能充分发挥HTML5的优...
  • liulf642161679
  • liulf642161679
  • 2015年09月21日 23:13
  • 1193
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:如何建立自己的上传组件的编程思路
举报原因:
原因补充:

(最多只允许输入30个字)