数据读取中...
 您当前位置:惠州维修 -> 网络-> asp技术交流 文章搜索:  
不用组件上载文件代码段
作者:转载 来源:惠州维修
日期: 2006-11-20
放大字体显示 缩小字体显示 打印文章 推荐给朋友
不用组件上载文件代码段



  下面将介绍一系列可以不用组件,而使用纯粹的ASP代码来上传文件
呵呵,我想这将给很多拥有个人主页的网友带来极大的方便。
  这个纯ASP代码由三个包含文件组成,代码中只使用了FileSystemObject
和Direction两个ASP固有对象。而不需要任何附加的组件,注意,为了保证
这段代码的出处,我没有对代码中的任何地方进行过修改。
  希望能够对大家有所帮助:
文件fupload.inc
<SCRIPT RUNAT=SERVER LANGUAGE=VBSCRIPT>
'Sample multiple binary files upload via ASP - upload include
'c1997-1999 Antonin Foller, PSTRUH Software, http://www.pstruh.cz
'The file is part of ScriptUtilities library
'The file enables http upload to ASP without any components.
'But there is a small problem - ASP does not allow save binary data to the disk.
' So you can use the upload for :
' 1. Upload small text (or HTML) files to server-side disk (Save the data by filesystem object)
' 2. Upload binary/text files of any size to server-side database (RS("BinField") = Upload("FormField").Value


'Limit of upload size
Dim UploadSizeLimit

'********************************** GetUpload **********************************
'This function reads all form fields from binary input and returns it as a dictionary object.
'The dictionary object containing form fields. Each form field is represented by six values :
'.Name name of the form field (<Input Name="..." Type="File,...">)
'.ContentDisposition = Content-Disposition of the form field
'.FileName = Source file name for <input type=file>
'.ContentType = Content-Type for <input type=file>
'.Value = Binary value of the source field.
'.Length = Len of the binary data field
Function GetUpload()
 Dim Result
 Set Result = Nothing
 If Request.ServerVariables("REQUEST_METHOD") = "POST" Then 'Request method must be "POST"
  Dim CT, PosB, Boundary, Length, PosE
  CT = Request.ServerVariables("HTTP_Content_Type") 'reads Content-Type header
  If LCase(Left(CT, 19)) = "multipart/form-data" Then 'Content-Type header must be "multipart/form-data"
   'This is upload request.
   'Get the boundary and length from Content-Type header
   PosB = InStr(LCase(CT), "boundary=") 'Finds boundary
   If PosB > 0 Then Boundary = Mid(CT, PosB + 9) 'Separetes boundary
   Length = CLng(Request.ServerVariables("HTTP_Content_Length")) 'Get Content-Length header
   if "" & UploadSizeLimit<>"" then
    UploadSizeLimit = clng(UploadSizeLimit)
    if Length > UploadSizeLimit then
'     on error resume next 'Clears the input buffer
'      response.AddHeader "Connection", "Close"
'     on error goto 0
     Request.BinaryRead(Length)
     Err.Raise 2, "GetUpload", "Upload size " & FormatNumber(Length,0) & "B exceeds limit of " & FormatNumber(UploadSizeLimit,0) & "B"
     exit function
    end if
   end if
   
   If Length > 0 And Boundary <> "" Then 'Are there required informations about upload ?
    Boundary = "--" & Boundary
    Dim Head, Binary
    Binary = Request.BinaryRead(Length) 'Reads binary data from client
    
    'Retrieves the upload fields from binary data
    Set Result = SeparateFields(Binary, Boundary)
    Binary = Empty 'Clear variables
   Else
    Err.Raise 10, "GetUpload", "Zero length request ."
   End If
  Else
   Err.Raise 11, "GetUpload", "No file sent."
  End If
 Else
  Err.Raise 1, "GetUpload", "Bad request method."
 End If
 Set GetUpload = Result
End Function

'********************************** SeparateFields **********************************
'This function retrieves the upload fields from binary data and retuns the fields as array
'Binary is safearray of all raw binary data from input.
Function SeparateFields(Binary, Boundary)
 Dim PosOpenBoundary, PosCloseBoundary, PosEndOfHeader, isLastBoundary
 Dim Fields
 Boundary = StringToBinary(Boundary)

  PosOpenBoundary = InstrB(Binary, Boundary)
  PosCloseBoundary = InstrB(PosOpenBoundary + LenB(Boundary), Binary, Boundary, 0)

 Set Fields = CreateObject("Scripting.Dictionary")

 Do While (PosOpenBoundary > 0 And PosCloseBoundary > 0 And Not isLastBoundary)
  'Header and file/source field data
  Dim HeaderContent, FieldContent
  'Header fields
  Dim Content_Disposition, FormFieldName, SourceFileName, Content_Type
  'Helping variables
  Dim Field, TwoCharsAfterEndBoundary
  'Get end of header
    PosEndOfHeader = InstrB(PosOpenBoundary + Len(Boundary), Binary, StringToBinary(vbCrLf + vbCrLf))

  'Separates field header
    HeaderContent = MidB(Binary, PosOpenBoundary + LenB(Boundary) + 2, PosEndOfHeader - PosOpenBoundary - LenB(Boundary) - 2)
    
  'Separates field content
    FieldContent = MidB(Binary, (PosEndOfHeader + 4), PosCloseBoundary - (PosEndOfHeader + 4) - 2)

  'Separates header fields from header
  GetHeadFields BinaryToString(HeaderContent), Content_Disposition, FormFieldName, SourceFileName, Content_Type

  'Create one field and assign parameters
  Set Field = CreateUploadField()
  Field.Name = FormFieldName
  Field.ContentDisposition = Content_Disposition
  Field.FilePath = SourceFileName
  Field.FileName = GetFileName(SourceFileName)
  Field.ContentType = Content_Type
  Field.Value = FieldContent
    Field.Length = LenB(FieldContent)

  Fields.Add FormFieldName, Field

  'Is this ending boundary ?
  TwoCharsAfterEndBoundary = BinaryToString(MidB(Binary, PosCloseBoundary + LenB(Boundary), 2))
    'Binary.Mid(PosCloseBoundary + Len(Boundary), 2).String
  isLastBoundary = TwoCharsAfterEndBoundary = "--"
  If Not isLastBoundary Then 'This is not ending boundary - go to next form field.
   PosOpenBoundary = PosCloseBoundary
      PosCloseBoundary = InStrB(PosOpenBoundary + LenB(Boundary), Binary, Boundary )
  End If
 Loop
 Set SeparateFields = Fields
End Function

'********************************** Utilities **********************************
Function BinaryToString(Binary)
  Dim I, S
  For I=1 to LenB(Binary)
    S = S & Chr(AscB(MidB(Binary,I,1)))
  Next
  BinaryToString = S
End Function

Function StringToBinary(String)
  Dim I, B
  For I=1 to len(String)
    B = B & ChrB(Asc(Mid(String,I,1)))
  Next
  StringToBinary = B
End Function

'Separates header fields from upload header
Function GetHeadFields(ByVal Head, Content_Disposition, Name, FileName, Content_Type)
 Content_Disposition = LTrim(SeparateField(Head, "content-disposition:", ";"))
 Name = (SeparateField(Head, "name=", ";")) 'ltrim
 If Left(Name, 1) = """" Then Name = Mid(Name, 2, Len(Name) - 2)
 FileName = (SeparateField(Head, "filename=", ";")) 'ltrim
 If Left(FileName, 1) = """" Then FileName = Mid(FileName, 2, Len(FileName) - 2)
 Content_Type = LTrim(SeparateField(Head, "content-type:", ";"))
End Function

'Separets one filed between sStart and sEnd
Function SeparateField(From, ByVal sStart, ByVal sEnd)
 Dim PosB, PosE, sFrom
 sFrom = LCase(From)
 PosB = InStr(sFrom, sStart)
 If PosB > 0 Then
  PosB = PosB + Len(sStart)
  PosE = InStr(PosB, sFrom, sEnd)
  If PosE = 0 Then PosE = InStr(PosB, sFrom, vbCrLf)
  If PosE = 0 Then PosE = Len(sFrom) + 1
  SeparateField = Mid(From, PosB, PosE - PosB)
 Else
  SeparateField = Empty
 End If
End Function

'Separetes file name from the full path of file
Function GetFileName(FullPath)
 Dim Pos, PosF
 PosF = 0
 For Pos = Len(FullPath) To 1 Step -1
  Select Case Mid(FullPath, Pos, 1)
   Case "/", "\": PosF = Pos + 1: Pos = 0
  End Select
 Next
 If PosF = 0 Then PosF = 1
 GetFileName = Mid(FullPath, PosF)
End Function
</SCRIPT>
<SCRIPT RUNAT=SERVER LANGUAGE=JSCRIPT>
//The function creates Field object.
function CreateUploadField(){ return new uf_Init() }
function uf_Init(){
 this.Name = null
 this.ContentDisposition = null
 this.FileName = null
 this.FilePath = null
 this.ContentType = null
 this.Value = null
 this.Length = null
}
</SCRIPT>



文件futils.inc
<SCRIPT RUNAT=SERVER LANGUAGE=VBSCRIPT>
'True PureASP upload - enables save of uploaded text fields to the disk.
'c1997-1999 Antonin Foller, PSTRUH Software, http://www.pstruh.cz
'The file is part of ScriptUtilities library
'The file enables http upload to ASP without any components.
'But there is a small problem - ASP does not allow save binary data to the disk.
' So you can use the upload for :
' 1. Upload small text (or HTML) files to server-side disk (Save the data by filesystem object)
' 2. Upload binary/text files of any size to server-side database (RS("BinField") = Upload("FormField").Value

'All uploaded files and log file will be saved to the next folder :
Dim LogFolder
LogFolder = Server.MapPath(".")

'********************************** SaveUpload **********************************
'This function creates folder and saves contents of the source fields to the disk.
'The fields are saved as files with names of form-field names.
'Also writes one line to the log file with basic informations about upload.
Function SaveUpload(Fields, DestinationFolder, LogFolder)
 if DestinationFolder = "" then DestinationFolder = Server.MapPath(".")

 Dim UploadNumber, OutFileName, FS, OutFolder, TimeName, Field
 Dim LogLine, pLogLine, OutLine

 'Create unique upload folder
 Application.Lock
  if Application("UploadNumber") = "" then
   Application("UploadNumber") = 1
  else
   Application("UploadNumber") = Application("UploadNumber") + 1
  end if
  UploadNumber = Application("UploadNumber")
 Application.UnLock

 TimeName = Right("0" & Year(Now), 2) & Right("0" & Month(Now), 2) & Right("0" & Day(Now), 2) & "_" & Right("0" & Hour(Now), 2) & Right("0" & Minute(Now), 2) & Right("0" & Second(Now), 2) & "-" & UploadNumber
 Set FS = CreateObject("Scripting.FileSystemObject")
 Set OutFolder = FS.CreateFolder(DestinationFolder + "\" + TimeName)

 Dim TextStream
 'Save the uploaded fields and create log line
 For Each Field In Fields.Items
  'Write content of the field to the disk
  '!!!! This function uses FileSystemObject to save the file. !!!!!
  'So you can only use text files to upload. Save binary files by the function takes undefined results.
  'To upload binary files see ScriptUtilities, http://www.pstruh.cz

  'You can save files with original file names :
  'Set TextStream = FS.CreateTextFile(OutFolder & "\" & Field.FileName )
  
  'Or with names of the fields
  Set TextStream = FS.CreateTextFile(OutFolder & "\" & Field.Name & ".")

    'And this is the problem why only short text files - BinaryToString uses char-to-char conversion. It takes a lot of computer time.
  TextStream.Write BinaryToString(Field.Value) ' BinaryToString is in upload.inc.
  TextStream.Close
  

  'Create log line with info about the field
  LogLine = LogLine & """" & LogF(Field.name) & LogSeparator & LogF(Field.Length) & LogSeparator & LogF(Field.ContentDisposition) & LogSeparator & LogF(Field.FileName) & LogSeparator & LogF(Field.ContentType) & """" & LogSeparator
 Next
 
 'Creates line with global request info
 pLogLine = pLogLine & Request.ServerVariables("REMOTE_ADDR") & LogSeparator
 pLogLine = pLogLine & LogF(Request.ServerVariables("LOGON_USER")) & LogSeparator
 pLogLine = pLogLine & Request.ServerVariables("HTTP_Content_Length") & LogSeparator
 pLogLine = pLogLine & OutFolder & LogSeparator
 pLogLine = pLogLine & LogLine
 pLogLine = pLogLine & LogF(Request.ServerVariables("HTTP_USER_AGENT")) & LogSeparator
 pLogLine = pLogLine & LogF(Request.ServerVariables("HTTP_COOKIE"))

 'Create output line for the client
 OutLine = OutLine & "Fields was saved to the <b>" & OutFolder & "</b> folder.
"
 
 DoLog pLogLine, "UP"
 
 OutFolder = Empty 'Clear variables.
 SaveUpload = OutLine
End Function

'Writes one log line to the log file
Function DoLog(LogLine, LogPrefix)
 if LogFolder = "" then LogFolder = Server.MapPath(".")
 Const LogSeparator = ", "
 Dim OutStream, FileName
 FileName = LogPrefix & Right("0" & Year(Now), 2) & Right("0" & Month(Now), 2) & Right("0" & Day(Now), 2) & ".LOG"

 Set OutStream = Server.CreateObject("Scripting.FileSystemObject").OpenTextFile(LogFolder & "\" & FileName, 8, True)
 OutStream.WriteLine Now() & LogSeparator & LogLine
 OutStream = Empty
End Function

'Returns field or "-" if field is empty
Function LogF(ByVal F)
 If "" & F = "" Then LogF = "-" Else LogF = "" & F
End Function

'Returns field or "-" if field is empty
Function LogFn(ByVal F)
 If "" & F = "" Then LogFn = "-" Else LogFn = formatnumber(F,0)
End Function

Dim Kernel, TickCount, KernelTime, UserTime
Sub BeginTimer()
on error resume next
 Set Kernel = CreateObject("ScriptUtils.Kernel") 'Creates the Kernel object
 'Get start times
 TickCount = Kernel.TickCount
 KernelTime = Kernel.CurrentThread.KernelTime
 UserTime = Kernel.CurrentThread.UserTime
on error goto 0
End Sub

Sub EndTimer()
 'Write times
on error resume next
 Response.Write "
Script time : " & (Kernel.TickCount - TickCount) & " ms"
 Response.Write "
Kernel time : " & CLng((Kernel.CurrentThread.KernelTime - KernelTime) * 86400000) & " ms"
 Response.Write "
User time : " & CLng((Kernel.CurrentThread.UserTime - UserTime) * 86400000) & " ms"
on error goto 0
 Kernel = Empty
End Sub
</SCRIPT>



文件fformat.inc
<SCRIPT RUNAT=SERVER LANGUAGE=VBSCRIPT>

function Foot()
 DIM HTML
  HTML = "<hr><Table Border=0 Width=100%><TR><TD><font size=1>燬ample upload/download via ASP from <a href=http://www.pstruh.cz>PSTRUH Software</a>.</font>"
  HTML = HTML & "</td><td Align=right><Font Size=1><A HRef=http://www.pstruh.cz/help/ScptUtl/library.htm>Activex Upload</A>?A HRef=http://www.pstruh.cz/help/usrmgr/library.htm>ActiveX UserManager</A>?A HRef=http://www.pstruh.cz/help/RSConv/library.htm>DBF on-the-fly</A>?A HRef=http://www.pstruh.cz/help/tcpip/library.htm>ActiveX DNS+TraceRoute</A>?A HRef=http://www.pstruh.cz/help/urlrepl/library.htm>URL Replacer</A>?/Font>"
  HTML = HTML & "</td></tr></table></Body></HTML>"
  Foot = HTML
end function

function Head(Title, Description)
 DIM HTML
  HTML = "<HTML><Head>"
 HTML = HTML & "<Title>" & Title & "</Title>"
 HTML = HTML & "<Meta Content=""" & Description & """ Name=""Description"">"
  HTML = HTML & Style()
  HTML = HTML & "</Head>"
  HTML = HTML & Body()
  Head = HTML
end function

function Body()
 DIM HTML
 HTML = "<body ALINK=YELLOW bgcolor=White LeftMargin=0 TopMargin=0>" &vbCrLf
  HTML = HTML & ClHead() &vbCrLf
  HTML = HTML & Source()
  Body = HTML
 '<LeftMargin=0 TopMargin=0 Style="margin-right:0pt; margin-top:0pt; margin-left:0pt;">
end function

function Style()
 Style = "<STYLE TYPE=""text/css""><--BODY{font-size:10pt;font-family:Arial,Arial CE,Helvetica,sans-serif }--></STYLE>"
 '<LeftMargin=0 TopMargin=0 Style="margin-right:0pt; margin-top:0pt; margin-left:0pt;">
end function

function ClHead()
 DIM HTML
 HTML = HTML & "<TABLE width=100% border=1 cellpadding=1 cellspacing=0 BORDERCOLOR=WHITE><tr bgcolor=SILVER>"
 HTML = HTML & "<th><a href=fupload.asp>Multiple text files upload</a></th>"
 HTML = HTML & "<th><a href=fdbupl.asp>Upload to database</a></th>"
 HTML = HTML & "<th><a href=fdbdown.asp>Download from database</a></th>"
 HTML = HTML & "<th><a href=" & request.servervariables("script_name") & "?S=1>View source</a></th>"
 HTML = HTML & "</tr></table>"
 ClHead = HTML
end function

function Source()
 DIM HTML
 if request.querystring("S")<>"" then
  HTML = HTML & "<pre>" & server.htmlencode(CreateObject("Scripting.FileSystemObject").OpenTextFile _
  (server.mappath(request.servervariables("script_name")), 1, False, False).readall) & "</pre>"
 end if
  Source = BasicEncode(HTML)
end function


Function BasicEncode(ByVal VBCode)
' Dim Pom, PosStart, PosEnd
' PosStart = InStr(VBCode, "'")
' Do While PosStart > 0
'  PosEnd = InStr(PosStart + 1, VBCode, vbCrLf)
'  If PosEnd = 0 Then PosEnd = Len(VBCode)
'  Pom = Left(VBCode, PosStart - 1) & "<font color=green>"
'  Pom = Pom & Mid(VBCode, PosStart, PosEnd - PosStart - 0) & "</font>"
'  Pom = Pom & Mid(VBCode, PosEnd)
'  VBCode = Pom
'  PosStart = InStr(PosEnd + 1, VBCode, "'")
' Loop
 VBCode = FilterBeginEnd(VBCode, "'", vbCrLf, "green")
 VBCode = FilterBeginEnd(VBCode, """, """, "brown")
 VBCode = FilterWord(VBCode, "Set ", "blue")
 VBCode = FilterWord(VBCode, "If ", "blue")
 VBCode = FilterWord(VBCode, "For ", "blue")
 VBCode = FilterWord(VBCode, " Then", "blue")
 VBCode = FilterWord(VBCode, " In ", "blue")
 VBCode = FilterWord(VBCode, "Each ", "blue")
 VBCode = FilterWord(VBCode, "Function ", "blue")
 VBCode = FilterWord(VBCode, "End Function", "blue")
 VBCode = FilterWord(VBCode, "MsgBox ", "blue")
 VBCode = FilterWord(VBCode, "OutPut ", "blue")
 VBCode = FilterWord(VBCode, "Empty", "blue")
 VBCode = FilterWord(VBCode, "Debug.Print ", "darkblue")
 VBCode = FilterWord(VBCode, "Print ", "blue")
 VBCode = FilterWord(VBCode, " And ", "blue")
 VBCode = FilterWord(VBCode, " Or ", "blue")
 VBCode = FilterWord(VBCode, "Next" & vbcrlf, "blue")
 VBCode = FilterWord(VBCode, "Next " , "blue")

 VBCode = FilterWord(VBCode, "Response.Write", "darkblue")
 VBCode = FilterWord(VBCode, "Response.BinaryWrite" , "darkblue")
 VBCode = FilterWord(VBCode, "Response.ContentType" , "darkblue")
 VBCode = FilterWord(VBCode, "Response.AddHeader" , "darkblue")
  
 VBCode = FilterWord(VBCode, "Server.CreateObject" , "darkblue")
 VBCode = FilterWord(VBCode, "CreateObject" , "darkblue")
 
' VBCode = FilterWord(VBCode," = ","red")
 BasicEncode = VBCode
End Function

Function FilterBeginEnd(ByVal VBCode, ByVal sBegin, ByVal sEnd, ByVal Color)
 Dim Pom, PosStart, PosEnd, FontColor
 FontColor = "<font color=" & Color & ">"
 PosStart = InStr(ucase(VBCode), ucase(sBegin))
 Do While PosStart > 0
  PosEnd = InStr(PosStart + Len(sBegin), ucase(VBCode), ucase(sEnd))
  If PosEnd = 0 Then PosEnd = Len(VBCode)
  Pom = Left(VBCode, PosStart - 1) & FontColor
  Pom = Pom & Mid(VBCode, PosStart, PosEnd - PosStart + Len(sEnd)) & "</font>"
  Pom = Pom & Mid(VBCode, PosEnd + Len(sEnd))
  VBCode = Pom
  PosStart = InStr(PosEnd + Len(FontColor) + Len("</font>") + Len(sEnd), ucase(VBCode), ucase(sBegin))
 Loop
 FilterBeginEnd = VBCode
End Function

Function FilterWord(ByVal VBCode, ByVal Word, ByVal Color)
 Dim Pom, PosStart, PosEnd, FontWord
 FontWord = "<font color=" & Color & ">" & Word & "</font>"
 PosStart = InStr(ucase(VBCode), ucase(Word))
 Do While PosStart > 0
  Pom = Left(VBCode, PosStart - 1) & FontWord
  Pom = Pom & Mid(VBCode, PosStart + Len(Word))
  VBCode = Pom
  PosStart = InStr(PosStart + Len(FontWord), ucase(VBCode), ucase(Word))
 Loop
 FilterWord = VBCode
End Function
</SCRIPT>

文章页数:[1] 
帮助你我他: 1.我有问题请教 2.我要投稿>>>
更多相关资料搜索:
热点文章
最新文章
相关文章
版权申明:除部分特别声明不要转载,或者授权本站独家播发的文章外,大家可以自由转载本站的原创文章,但原作者和来自本站的链接必须保留(非本站原创的,按照原来自一节,自行链接)。文章版权归本站和作者共有。
转载要求:转载之图片、文件,链接请不要盗链到本站,且不准打上各自站点的水印,亦不能抹去本站水印。
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有。
发表评论  打印  刷新  推荐给朋友  返回顶部  关闭

网上大名: