FileCloud 的原理简述&自己搭建文件云

FileCloud 的原理简述&自己搭建文件云

copyright(c) by zcy

关于如何使用IIS创建asp服务,请读者自行研究

注:不要忘记添加入站规则

代码的存储:

  • 根目录

    • filecloudEV.html 提前验证

    • filecloudEV.aspx 判断密码是否正确

    • filecloudMAIN.aspx 主界面

    • UpLoad.asp 上传界面

    • SaveFile.asp 保存文件

    • InputFilename.aspx 让用户输入文件名

    • AddPath.aspx 将当前文件加入文件清单

    • clsField.asp 文件上传的底层支持代码

    • clsUpload.asp 文件上传的底层支持代码

    • DownLoad.aspx 下载界面

    • list.txt 用户上传的文件的清单

    • files 用户上传的文件的储存文件夹

用户首先是进入filecloudEV.html进行验证:

<html>
    <head>
        <title>filecloud early verification</title>
        <meta charset="UTF-8"></meta>
    </head>
    <body>
        <form action="filecloudEV.aspx" method="post">
            <center>
                <p style="font-size:50px;">Password</p>
                <input type="password" name="password" style="font-size:50px;"></input>
                <input type="submit" value="Submit" style="font-size:50px;"></input>
            </center>
        </form>
    </body>
</html> 

 

一个文本框,将用户输入的密码传到filecloudEV.aspx里面去

filecloudEV.aspx

<html>
    <head>
        <title>filecloud early verification</title>
        <meta charset="UTF-8"></meta>
    </head>
    <body>
        <%
            dim a
            a=Request.Form("password")
            response.write("<center><p style=""font-size:30px"">")
            if a="XXXXXXX" then '验证密码是否正确
                response.write("Password is right!")%>
        <form action="filecloudMAIN.aspx" method="post"><!--只有正确才显示这个跳转按钮-->
            <input type="submit" value="跳转" style="font-size:30px"></input>
        </form>
        <%
            else
                response.write("Password is wrong!")
                response.write("Please go back")
            end if
            response.write("</p></center>")
        %>
    </body>
</html>

 

然后进入主界面:

filecloudMAIN.aspx

<html>
    <head>
        <title>FilecloudMAIN</title>
        <meta charset="UTF-8"></meta>
    </head>
    <body>
        <center>
            <a href="./UpLoad.asp" style="font-size:50px">UpLoad</a><br /><br />
            <a href="./DownLoad.aspx" style="font-size:50px">DownLoad</a><br /><br />
        </center>
    </body>
</html>

 

其实就只是显示了两个超链接:

先来介绍一下上传:

UpLoad.asp

<html>
    <head>
        <title>UpLoad</title>
        <meta charset="UTF-8">
    </head>
    <body>
        <form method="post" encType="multipart/form-data" action="SaveFile.asp">
            <input type="File" name="File1">
            <input type="Submit" value="Upload">
        </form> 
    </body>
</html>

 

把文件流传到SaveFile.asp中

SaveFile.asp

<!--#INCLUDE FILE="clsUpload.asp"--> <!--引用clsUpLoad.asp-->
<html>
    <head>
        <title>SaveFile</title>
        <meta charset="UTF-8">
    </head>
    <body>
        <%
            Dim Upload
            Dim Folder
            Set Upload = New clsUpload
            Folder = Server.MapPath("Uploads") & "\" '绑定储存文件的路径
            Upload("File1").SaveAs Folder & Upload("File1").FileName '保存文件
            Set Upload = Nothing      
            Response.Write("<script>alert('UpLoad Success!');window.location.href='InputFilename.aspx'</script>") '跳转到InputFilename.aspx
        %>
    </body>
</html>

 

接下来介绍一下clsUpload.asp

声明:这个文件以及下面的clsField.asp都是我从Stack Overflow中找到的

clsUpload.asp

<!--METADATA
  TYPE="TypeLib"
  NAME="Microsoft ActiveX Data Objects 2.5 Library"
  UUID="{00000205-0000-0010-8000-00AA006D2EA4}"
  VERSION="2.5"
-->
<!--#INCLUDE FILE="clsField.asp"--><%
' ------------------------------------------------------------------------------
'   Author:     Lewis Moten
'   Date:       March 19, 2002
' ------------------------------------------------------------------------------
' Upload class retrieves multi-part form data posted to web page
' and parses it into objects that are easy to interface with.
' Requires MDAC (ADODB) COM components found on most servers today
' Additional compenents are not necessary.
'
​
Class clsUpload
' ------------------------------------------------------------------------------
Private mbinData            ' bytes visitor sent to server
    Private mlngChunkIndex      ' byte where next chunk starts
    Private mlngBytesReceived   ' length of data
    Private mstrDelimiter       ' Delimiter between multipart/form-data (43 chars)
Private CR                  ' ANSI Carriage Return
    Private LF                  ' ANSI Line Feed
    Private CRLF                ' ANSI Carriage Return & Line Feed
Private mobjFieldAry()      ' Array to hold field objects
    Private mlngCount           ' Number of fields parsed
' ------------------------------------------------------------------------------
    Private Sub RequestData
​
        Dim llngLength      ' Number of bytes received
' Determine number bytes visitor sent
        mlngBytesReceived = Request.TotalBytes
​
        ' Store bytes recieved from visitor
        mbinData = Request.BinaryRead(mlngBytesReceived)
​
    End Sub
' ------------------------------------------------------------------------------
    Private Sub ParseDelimiter()
​
        ' Delimiter seperates multiple pieces of form data
            ' "around" 43 characters in length
            ' next character afterwards is carriage return (except last line has two --)
            ' first part of delmiter is dashes followed by hex number
            ' hex number is possibly the browsers session id?
' Examples:
' -----------------------------7d230d1f940246
        ' -----------------------------7d22ee291ae0114
​
        mstrDelimiter = MidB(mbinData, 1, InStrB(1, mbinData, CRLF) - 1)
​
    End Sub
' ------------------------------------------------------------------------------
    Private Sub ParseData()
​
        ' This procedure loops through each section (chunk) found within the
        ' delimiters and sends them to the parse chunk routine
Dim llngStart   ' start position of chunk data
        Dim llngLength  ' Length of chunk
        Dim llngEnd     ' Last position of chunk data
        Dim lbinChunk   ' Binary contents of chunk
' Initialize at first character
        llngStart = 1' Find start position
        llngStart = InStrB(llngStart, mbinData, mstrDelimiter & CRLF)
​
        ' While the start posotion was found
        While Not llngStart = 0' Find the end position (after the start position)
            llngEnd = InStrB(llngStart + 1, mbinData, mstrDelimiter) - 2' Determine Length of chunk
            llngLength = llngEnd - llngStart
​
            ' Pull out the chunk
            lbinChunk = MidB(mbinData, llngStart, llngLength)
​
            ' Parse the chunk
            Call ParseChunk(lbinChunk)
​
            ' Look for next chunk after the start position
            llngStart = InStrB(llngStart + 1, mbinData, mstrDelimiter & CRLF)
​
        WendEnd Sub
' ------------------------------------------------------------------------------
    Private Sub ParseChunk(ByRef pbinChunk)
​
        ' This procedure gets a chunk passed to it and parses its contents.
        ' There is a general format that the chunk follows.
' First, the deliminator appears
' Next, headers are listed on each line that define properties of the chunk.
'   Content-Disposition: form-data: name="File1"; filename="C:\Photo.gif"
        '   Content-Type: image/gif
' After this, a blank line appears and is followed by the binary data.
Dim lstrName            ' Name of field
        Dim lstrFileName        ' File name of binary data
        Dim lstrContentType     ' Content type of binary data
        Dim lbinData            ' Binary data
        Dim lstrDisposition     ' Content Disposition
        Dim lstrValue           ' Value of field
' Parse out the content dispostion
        lstrDisposition = ParseDisposition(pbinChunk)
​
            ' And Parse the Name
            lstrName = ParseName(lstrDisposition)
​
            ' And the file name
            lstrFileName = ParseFileName(lstrDisposition)
​
        ' Parse out the Content Type
        lstrContentType = ParseContentType(pbinChunk)
​
        ' If the content type is not defined, then assume the
        ' field is a normal form field
        If lstrContentType = "" Then' Parse Binary Data as Unicode
            lstrValue = CStrU(ParseBinaryData(pbinChunk))
​
        ' Else assume the field is binary data
        Else' Parse Binary Data
            lbinData = ParseBinaryData(pbinChunk)
​
        End If' Add a new field
        Call AddField(lstrName, lstrFileName, lstrContentType, lstrValue, lbinData)
​
    End Sub
' ------------------------------------------------------------------------------
    Private Sub AddField(ByRef pstrName, ByRef pstrFileName, ByRef pstrContentType, ByRef pstrValue, ByRef pbinData)
​
        Dim lobjField       ' Field object class
' Add a new index to the field array
        ' Make certain not to destroy current fields
        ReDim Preserve mobjFieldAry(mlngCount)
​
        ' Create new field object
        Set lobjField = New clsField
​
        ' Set field properties
        lobjField.Name = pstrName
        lobjField.FilePath = pstrFileName               
        lobjField.FileName = Mid(pstrFileName, InStrRev(pstrFileName, "\") + 1) ' <= line added to set the file name
        lobjField.ContentType = pstrContentType
​
        ' If field is not a binary file
        If LenB(pbinData) = 0 Then
​
            lobjField.BinaryData = ChrB(0)
            lobjField.Value = pstrValue
            lobjField.Length = Len(pstrValue)
​
        ' Else field is a binary file
        Else
​
            lobjField.BinaryData = pbinData
            lobjField.Length = LenB(pbinData)
            lobjField.Value = ""End If' Set field array index to new field
        Set mobjFieldAry(mlngCount) = lobjField
​
        ' Incriment field count
        mlngCount = mlngCount + 1End Sub
' ------------------------------------------------------------------------------
    Private Function ParseBinaryData(ByRef pbinChunk)
​
        ' Parses binary content of the chunk
Dim llngStart   ' Start Position
' Find first occurence of a blank line
        llngStart = InStrB(1, pbinChunk, CRLF & CRLF)
​
        ' If it doesn't exist, then return nothing
        If llngStart = 0 Then Exit Function' Incriment start to pass carriage returns and line feeds
        llngStart = llngStart + 4' Return the last part of the chunk after the start position
        ParseBinaryData = MidB(pbinChunk, llngStart)
​
    End Function
' ------------------------------------------------------------------------------
    Private Function ParseContentType(ByRef pbinChunk)
​
        ' Parses the content type of a binary file.
        '   example: image/gif is the content type of a GIF image.
Dim llngStart   ' Start Position
        Dim llngEnd     ' End Position
        Dim llngLength  ' Length
' Fid the first occurance of a line starting with Content-Type:
        llngStart = InStrB(1, pbinChunk, CRLF & CStrB("Content-Type:"), vbTextCompare)
​
        ' If not found, return nothing
        If llngStart = 0 Then Exit Function' Find the end of the line
        llngEnd = InStrB(llngStart + 15, pbinChunk, CR)
​
        ' If not found, return nothing
        If llngEnd = 0 Then Exit Function' Adjust start position to start after the text "Content-Type:"
        llngStart = llngStart + 15' If the start position is the same or past the end, return nothing
        If llngStart >= llngEnd Then Exit Function' Determine length
        llngLength = llngEnd - llngStart
​
        ' Pull out content type
        ' Convert to unicode
        ' Trim out whitespace
        ' Return results
        ParseContentType = Trim(CStrU(MidB(pbinChunk, llngStart, llngLength)))
​
    End Function
' ------------------------------------------------------------------------------
    Private Function ParseDisposition(ByRef pbinChunk)
​
        ' Parses the content-disposition from a chunk of data
        '
        ' Example:
        '
        '   Content-Disposition: form-data: name="File1"; filename="C:\Photo.gif"
        '
        '   Would Return:
        '       form-data: name="File1"; filename="C:\Photo.gif"
Dim llngStart   ' Start Position
        Dim llngEnd     ' End Position
        Dim llngLength  ' Length
' Find first occurance of a line starting with Content-Disposition:
        llngStart = InStrB(1, pbinChunk, CRLF & CStrB("Content-Disposition:"), vbTextCompare)
​
        ' If not found, return nothing
        If llngStart = 0 Then Exit Function' Find the end of the line
        llngEnd = InStrB(llngStart + 22, pbinChunk, CRLF)
​
        ' If not found, return nothing
        If llngEnd = 0 Then Exit Function' Adjust start position to start after the text "Content-Disposition:"
        llngStart = llngStart + 22' If the start position is the same or past the end, return nothing
        If llngStart >= llngEnd Then Exit Function' Determine Length
        llngLength = llngEnd - llngStart
​
        ' Pull out content disposition
        ' Convert to Unicode
        ' Return Results
        ParseDisposition = CStrU(MidB(pbinChunk, llngStart, llngLength))
​
    End Function
' ------------------------------------------------------------------------------
    Private Function ParseName(ByRef pstrDisposition)
​
        ' Parses the name of the field from the content disposition
        '
        ' Example
        '
        '   form-data: name="File1"; filename="C:\Photo.gif"
        '
        '   Would Return:
        '       File1
Dim llngStart   ' Start Position
        Dim llngEnd     ' End Position
        Dim llngLength  ' Length
' Find first occurance of text name="
        llngStart = InStr(1, pstrDisposition, "name=""", vbTextCompare)
​
        ' If not found, return nothing
        If llngStart = 0 Then Exit Function' Find the closing quote
        llngEnd = InStr(llngStart + 6, pstrDisposition, """")
​
        ' If not found, return nothing
        If llngEnd = 0 Then Exit Function' Adjust start position to start after the text name="
        llngStart = llngStart + 6' If the start position is the same or past the end, return nothing
        If llngStart >= llngEnd Then Exit Function' Determine Length
        llngLength = llngEnd - llngStart
​
        ' Pull out field name
        ' Return results
        ParseName = Mid(pstrDisposition, llngStart, llngLength)
​
    End Function
' ------------------------------------------------------------------------------
    Private Function ParseFileName(ByRef pstrDisposition)
        ' Parses the name of the field from the content disposition
        '
        ' Example
        '
        '   form-data: name="File1"; filename="C:\Photo.gif"
        '
        '   Would Return:
        '       C:\Photo.gif
Dim llngStart   ' Start Position
        Dim llngEnd     ' End Position
        Dim llngLength  ' Length
' Find first occurance of text filename="
        llngStart = InStr(1, pstrDisposition, "filename=""", vbTextCompare)
​
        ' If not found, return nothing
        If llngStart = 0 Then Exit Function' Find the closing quote
        llngEnd = InStr(llngStart + 10, pstrDisposition, """")
​
        ' If not found, return nothing
        If llngEnd = 0 Then Exit Function' Adjust start position to start after the text filename="
        llngStart = llngStart + 10' If the start position is the same of past the end, return nothing
        If llngStart >= llngEnd Then Exit Function' Determine length
        llngLength = llngEnd - llngStart
​
        ' Pull out file name
        ' Return results
        ParseFileName = Mid(pstrDisposition, llngStart, llngLength)
​
    End Function
' ------------------------------------------------------------------------------
    Public Property Get Count()
​
        ' Return number of fields found
        Count = mlngCount
​
    End Property
' ------------------------------------------------------------------------------
Public Default Property Get Fields(ByVal pstrName)
​
        Dim llngIndex   ' Index of current field
' If a number was passed
        If IsNumeric(pstrName) Then
​
            llngIndex = CLng(pstrName)
​
            ' If programmer requested an invalid number
            If llngIndex > mlngCount - 1 Or llngIndex < 0 Then
                ' Raise an error
                Call Err.Raise(vbObjectError + 1, "clsUpload.asp", "Object does not exist within the ordinal reference.")
                Exit Property
            End If' Return the field class for the index specified
            Set Fields = mobjFieldAry(pstrName)
​
        ' Else a field name was passed
        Else' convert name to lowercase
            pstrName = LCase(pstrname)
​
            ' Loop through each field
            For llngIndex = 0 To mlngCount - 1' If name matches current fields name in lowercase
                If LCase(mobjFieldAry(llngIndex).Name) = pstrName Then' Return Field Class
                    Set Fields = mobjFieldAry(llngIndex)
                    Exit PropertyEnd IfNextEnd If' If matches were not found, return an empty field
        Set Fields = New clsField
​
'       ' ERROR ON NonExistant:
'       ' If matches were not found, raise an error of a non-existent field
'       Call Err.Raise(vbObjectError + 1, "clsUpload.asp", "Object does not exist within the ordinal reference.")
'       Exit Property
End Property
' ------------------------------------------------------------------------------
    Private Sub Class_Terminate()
​
        ' This event is called when you destroy the class.
        '
        ' Example:
        '   Set objUpload = Nothing
        '
        ' Example:
        '   Response.End
        '
        ' Example:
        '   Page finnishes executing ...
Dim llngIndex   ' Current Field Index
' Loop through fields
        For llngIndex = 0 To mlngCount - 1' Release field object
            Set mobjFieldAry(llngIndex) = NothingNext' Redimension array and remove all data within
        ReDim mobjFieldAry(-1)
​
    End Sub
' ------------------------------------------------------------------------------
    Private Sub Class_Initialize()
​
        ' This event is called when you instantiate the class.
        '
        ' Example:
        '   Set objUpload = New clsUpload
' Redimension array with nothing
        ReDim mobjFieldAry(-1)
​
        ' Compile ANSI equivilants of carriage returns and line feeds
​
        CR = ChrB(Asc(vbCr))    ' vbCr      Carriage Return
        LF = ChrB(Asc(vbLf))    ' vbLf      Line Feed
        CRLF = CR & LF          ' vbCrLf    Carriage Return & Line Feed
' Set field count to zero
        mlngCount = 0' Request data
        Call RequestData
​
        ' Parse out the delimiter
        Call ParseDelimiter()
​
        ' Parse the data
        Call ParseData
​
    End Sub
' ------------------------------------------------------------------------------
    Private Function CStrU(ByRef pstrANSI)
​
        ' Converts an ANSI string to Unicode
        ' Best used for small strings
Dim llngLength  ' Length of ANSI string
        Dim llngIndex   ' Current position
' determine length
        llngLength = LenB(pstrANSI)
​
        ' Loop through each character
        For llngIndex = 1 To llngLength
​
            ' Pull out ANSI character
            ' Get Ascii value of ANSI character
            ' Get Unicode Character from Ascii
            ' Append character to results
            CStrU = CStrU & Chr(AscB(MidB(pstrANSI, llngIndex, 1)))
​
        NextEnd Function
' ------------------------------------------------------------------------------
    Private Function CStrB(ByRef pstrUnicode)
​
        ' Converts a Unicode string to ANSI
        ' Best used for small strings
Dim llngLength  ' Length of ANSI string
        Dim llngIndex   ' Current position
' determine length
        llngLength = Len(pstrUnicode)
​
        ' Loop through each character
        For llngIndex = 1 To llngLength
​
            ' Pull out Unicode character
            ' Get Ascii value of Unicode character
            ' Get ANSI Character from Ascii
            ' Append character to results
            CStrB = CStrB & ChrB(Asc(Mid(pstrUnicode, llngIndex, 1)))
​
        NextEnd Function
' ------------------------------------------------------------------------------
End Class
' ------------------------------------------------------------------------------
%>

 

clsField.asp

<%
' ------------------------------------------------------------------------------
'   Author:     Lewis Moten
'   Date:       March 19, 2002
' ------------------------------------------------------------------------------
' Field class represents interface to data passed within one field
'
' ------------------------------------------------------------------------------
Class clsField
​
    Public Name             ' Name of the field defined in form
Private mstrPath        ' Full path to file on visitors computer
                            ' C:\Documents and Settings\lmoten\Desktop\Photo.gif
Public FileDir          ' Directory that file existed in on visitors computer
                            ' C:\Documents and Settings\lmoten\Desktop
Public FileExt          ' Extension of the file
                            ' GIF
Public FileName         ' Name of the file
                            ' Photo.gif
Public ContentType      ' Content / Mime type of file
                            ' image/gif
Public Value            ' Unicode value of field (used for normail form fields - not files)
Public BinaryData       ' Binary data passed with field (for files)
Public Length           ' byte size of value or binary data
Private mstrText        ' Text buffer 
                                ' If text format of binary data is requested more then
                                ' once, this value will be read to prevent extra processing
' ------------------------------------------------------------------------------
    Public Property Get BLOB()
        BLOB = BinaryData
    End Property
' ------------------------------------------------------------------------------
    Public Function BinaryAsText()
​
        ' Binary As Text returns the unicode equivilant of the binary data.
        ' this is useful if you expect a visitor to upload a text file that
        ' you will need to work with.
' NOTICE:
        ' NULL values will prematurely terminate your Unicode string.
        ' NULLs are usually found within binary files more often then plain-text files.
        ' a simple way around this may consist of replacing null values with another character
        ' such as a space " "
Dim lbinBytes
        Dim lobjRs
​
        ' Don't convert binary data that does not exist
        If Length = 0 Then Exit Function
        If LenB(BinaryData) = 0 Then Exit Function' If we previously converted binary to text, return the buffered content
        If Not Len(mstrText) = 0 Then
            BinaryAsText = mstrText
            Exit Function
        End If' Convert Integer Subtype Array to Byte Subtype Array
        lbinBytes = ASCII2Bytes(BinaryData)
​
        ' Convert Byte Subtype Array to Unicode String
        mstrText = Bytes2Unicode(lbinBytes)
​
        ' Return Unicode Text
        BinaryAsText = mstrText
​
    End Function
' ------------------------------------------------------------------------------
    Public Sub SaveAs(ByRef pstrFileName)
​
        Dim lobjStream
        Dim lobjRs
        Dim lbinBytes
​
        ' Don't save files that do not posess binary data
        If Length = 0 Then Exit Sub
        If LenB(BinaryData) = 0 Then Exit Sub' Create magical objects from never never land
        Set lobjStream = Server.CreateObject("ADODB.Stream")
​
        ' Let stream know we are working with binary data
        lobjStream.Type = adTypeBinary
​
        ' Open stream
        Call lobjStream.Open()
​
        ' Convert Integer Subtype Array to Byte Subtype Array
        lbinBytes = ASCII2Bytes(BinaryData)
​
        ' Write binary data to stream
        Call lobjStream.Write(lbinBytes)
​
        ' Save the binary data to file system
        '   Overwrites file if previously exists!
        Call lobjStream.SaveToFile(pstrFileName, adSaveCreateOverWrite)
​
        ' Close the stream object
        Call lobjStream.Close()
​
        ' Release objects
        Set lobjStream = NothingEnd Sub
' ------------------------------------------------------------------------------
    Public Property Let FilePath(ByRef pstrPath)
​
        mstrPath = pstrPath
​
        ' Parse File Ext
        If Not InStrRev(pstrPath, ".") = 0 Then
            FileExt = Mid(pstrPath, InStrRev(pstrPath, ".") + 1)
            FileExt = UCase(FileExt)
        End If' Parse File Name
        If Not InStrRev(pstrPath, "\") = 0 Then
            FileName = Mid(pstrPath, InStrRev(pstrPath, "\") + 1)
        End If' Parse File Dir
        If Not InStrRev(pstrPath, "\") = 0 Then
            FileDir = Mid(pstrPath, 1, InStrRev(pstrPath, "\") - 1)
        End IfEnd Property
' ------------------------------------------------------------------------------
    Public Property Get FilePath()
        FilePath = mstrPath
    End Property
' ------------------------------------------------------------------------------
    Private Function ASCII2Bytes(ByRef pbinBinaryData)
​
        Dim lobjRs
        Dim llngLength
        Dim lbinBuffer
​
        ' get number of bytes
        llngLength = LenB(pbinBinaryData)
​
        Set lobjRs = Server.CreateObject("ADODB.Recordset")
​
        ' create field in an empty recordset to hold binary data
        Call lobjRs.Fields.Append("BinaryData", adLongVarBinary, llngLength)
​
        ' Open recordset
        Call lobjRs.Open()
​
        ' Add a new record to recordset
        Call lobjRs.AddNew()
​
        ' Populate field with binary data
        Call lobjRs.Fields("BinaryData").AppendChunk(pbinBinaryData & ChrB(0))
​
        ' Update / Convert Binary Data
            ' Although the data we have is binary - it has still been
            ' formatted as 4 bytes to represent each byte.  When we
            ' update the recordset, the Integer Subtype Array that we
            ' passed into the Recordset will be converted into a
            ' Byte Subtype Array
        Call lobjRs.Update()
​
        ' Request binary data and save to stream
        lbinBuffer = lobjRs.Fields("BinaryData").GetChunk(llngLength)
​
        ' Close recordset
        Call lobjRs.Close()
​
        ' Release recordset from memory
        Set lobjRs = Nothing' Return Bytes
        ASCII2Bytes = lbinBuffer
​
    End Function
' ------------------------------------------------------------------------------
    Private Function Bytes2Unicode(ByRef pbinBytes)
​
        Dim lobjRs
        Dim llngLength
        Dim lstrBuffer
​
        llngLength = LenB(pbinBytes)
​
        Set lobjRs = Server.CreateObject("ADODB.Recordset")
​
        ' Create field in an empty recordset to hold binary data
        Call lobjRs.Fields.Append("BinaryData", adLongVarChar, llngLength)
​
        ' Open Recordset
        Call lobjRs.Open()
​
        ' Add a new record to recordset
        Call lobjRs.AddNew()
​
        ' Populate field with binary data
        Call lobjRs.Fields("BinaryData").AppendChunk(pbinBytes)
​
        ' Update / Convert.
            ' Ensure bytes are proper subtype
        Call lobjRs.Update()
​
        ' Request unicode value of binary data
        lstrBuffer = lobjRs.Fields("BinaryData").Value
​
        ' Close recordset
        Call lobjRs.Close()
​
        ' Release recordset from memory
        Set lobjRs = Nothing' Return Unicode
        Bytes2Unicode = lstrBuffer
​
    End Function' ------------------------------------------------------------------------------
End Class
' ------------------------------------------------------------------------------
%>

 

但是我们还需要把这个文件名加到文件列表中(如果说不添加,可以在服务器后端运行一个不断获取文件夹内的文件列表写入list.txt比较麻烦

于是我们就需要让用户自己输入刚才上传的文件名:

InputFilename.aspx

<html>
    <head>
        <title>Filename Inputer</title>
        <meta charset="UTF-8">
    </head>
    <body>
        <form action="AddPath.aspx" method="post"><!--让AddPath.aspx将它加入列表-->
            <p>Input the file's filename you upload just then:</p>
            <input type="input" name="fnm">
            <input type="submit" value="Submit">
        </form>
    </body>
</html>

 

AddPath.aspx

<%@ Page Debug="true" %>
<html>
    <head>
        <title>AddPath</title>
        <meta charset="UTF-8">
    </head>
    <body>
        <%
            Dim fso
            Dim f
            fso=CreateObject("Scripting.FileSystemObject")
            f=fso.OpenTextFile("D:\cloud\list.txt",8,True) '注意这里要用绝对路径,不然会引发权限错误
            Dim fnm
            fnm=Request.Form("fnm")
            f.WriteLine(fnm)
            f.Close
            Response.write("<script>alert('UpLoad Success!');window.location.href='./UpLoad.asp';</script>") '跳转回去
        %>
    </body>
</html>

 

上传到此结束,接下来看下载

DownLoad.aspx

<html>
    <head>
        <title>DownLoad</title>
        <meta charset="UTF-8"></meta>
    </head>
    <body>
        <%
            Dim Fso
            Dim myFile
            Fso = Server.CreateObject("Scripting.FileSystemObject")
            myFile = Fso.OpenTextFile(Server.MapPath("list.txt"),1,True)
            While Not myFile.AtEndOfStream '将文件列表中的全部输出
                Dim V=myFile.ReadLine
                Response.Write("<a href='UpLoads\" & V & "' download='" & V & "'style='font-size:30px'>" & V & "</a><br /><br />") '输出下载标签
            End While
        %>
    </body>
</html>

 

到此,所有文件都写完了,接下来可以http://localhost:端口/filecloudEV.html查看效果了

但是这个网址还有一个问题:

如果用户直接访问filecloudMAIN文件,TA可以直接绕过之前的验证,所以需要cookies的传递,请读者自行研究

posted @ 2018-12-22 13:55  zhuchengyang  阅读(1423)  评论(0编辑  收藏  举报