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)
Wend
End 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 + 1
End 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 Property
End If
Next
End 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) = Nothing
Next
' 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)))
Next
End 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)))
Next
End 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 = Nothing
End 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 If
End 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的传递,请读者自行研究
FileCloud 的原理简述&自己搭建文件云的更多相关文章
- keepalived工作原理和配置说明 腾讯云VPC内通过keepalived搭建高可用主备集群
keepalived工作原理和配置说明 腾讯云VPC内通过keepalived搭建高可用主备集群 内网路由都用mac地址 一个mac地址绑定多个ip一个网卡只能一个mac地址,而且mac地址无法改,但 ...
- ButterKnife的原理简述
ButterKnife的原理简述 注解处理器Java5 中叫APT(Annotation Processing Tool),在Java6开始,规范化为 Pluggable Annotation Pro ...
- 轻松搭建Windows8云平台开发环境
原文:轻松搭建Windows8云平台开发环境 Windows Store应用是基于Windows 8操作系统的新一代Windows应用程序,其开发平台以及运行模式和以往传统平台略有不同.为了帮助更多开 ...
- [阿里云部署] Ubuntu+Flask+Nginx+uWSGI+Mysql搭建阿里云Web服务器
部署地址:123.56.7.181 Ubuntu+Flask+Nginx+uWSGI+Mysql搭建阿里云Web服务器 这个标题就比之前的"ECS服务器配置Web环境的全过程及参考资料&qu ...
- centos DNS服务搭建 DNS原理 使用bind搭建DNS服务器 配置DNS转发 配置主从 安装dig工具 DHCP dhclient 各种域名解析记录 mydns DNS动态更新 第三十节课
centos DNS服务搭建 DNS原理 使用bind搭建DNS服务器 配置DNS转发 配置主从 安装dig工具 DHCP dhclient 各种域名解析记录 mydns DNS动态更 ...
- [Windows Server 2008] 搭建数据云备份
★ 欢迎来到[护卫神·V课堂],网站地址:http://v.huweishen.com ★ 护卫神·V课堂 是护卫神旗下专业提供服务器教学视频的网站,每周更新视频. ★ 本节我们将带领大家:如何搭建数 ...
- [转帖]使用fastdfs搭建文件管理系统
使用fastdfs搭建文件管理系统 https://www.jianshu.com/p/4e80069c84d3 今天同事说他们的系统用到了这个分布式文件管理系统. 一.FastDFS介绍 FastD ...
- docker 搭建私有云盘 Seafile
缘起 现如今各种云存储服务其实挺多的,国外有经典的DropBox.Google Drive.微软的OneDrive等,国内也有可以免费使用的各种云. 那么为什么想要搭建私有云存储呢?主要是本着“自己的 ...
- 实用的Python(3)超简单!基于Python搭建个人“云盘”
1 简介 当我们想要从本地向云服务器上传文件时,比较常用的有pscp等工具,但避免不了每次上传都要写若干重复的代码,而笔者最近发现的一个基于Python的工具updog,可以帮助我们在服务器上搭建类似 ...
随机推荐
- NX二次开发-创建圆弧(起点-终点-半径)UF_CURVE_create_arc_point_point_radius
NX9+VS2012 #include <uf.h> #include <uf_curve.h> UF_initialize(); //起点 ]; ArcStartPoint[ ...
- 牛客多校第八场 G Gemstones 栈/贪心
题意: 对于一个序列,把可以把连着三个相同的字母拿走,问最多拿走多少组. 题解: 直接模拟栈,三个栈顶元素相同则答案+1,并弹出栈 #include<bits/stdc++.h> usin ...
- webconfig节点值里的文字换行问题
有时候会遇到在配置节点中配置文字的问题,比如: <add key="notice" value="温馨提示:1,感谢您访问; \n 2,谢谢来访"/> ...
- 5天玩转C#并行和多线程编程 —— 第一天 认识Parallel 转载 https://www.cnblogs.com/yunfeifei/p/3993401.html
5天玩转C#并行和多线程编程系列文章目录 5天玩转C#并行和多线程编程 —— 第一天 认识Parallel 5天玩转C#并行和多线程编程 —— 第二天 并行集合和PLinq 5天玩转C#并行和多线程编 ...
- 初探分布式环境的指挥官ZooKeeper
目录 1. 从单机到集群,分布式环境中的挑战 1.1 集中式的特点 1.2 集中式的痛点 1.3 从单体到SOA的转变 1.4 分布式服务总体框架 1.5 分布式应用概述 2. ZK基本概念及核心原理 ...
- pycharm快捷键表
快捷键 作用 ctrl(command)+c 复制 ctrl+v 粘贴 ctrl+z 撤销 ctrl+x 剪切,默认整行 ctrl+a 全选 ctrl+f 查找:选中批量修改 shift+ctrl+z ...
- 【POJ】1797 Heavy Transportation
题目链接:http://poj.org/problem?id=1797 题意:n个城镇,m条路上能承载的最大重量.现在问你从1到n的最大承重量. 题解:spfa的变体. 假设当前1->当前点的承 ...
- hadoop系列(一)window10下hadoop安装
风闻win10不需要cygwin就能用hadoop了,赶紧试试. 去官网下载hadoop-2.8.3,然后去 https://github.com/steveloughran/winutils 下载h ...
- 事务和JDBC事务隔离级别
与事务相关的理论 mysql事物隔离级别:http://mj4d.iteye.com/blog/1744276 事务(Transaction): 是并发控制的单元,是用户定义的一个操作序列.这些操作要 ...
- rem换算公式
当前rem基准值=预设的基准值/设计稿宽度*当前设备的宽度