热门文章
 
fso操作文件 实例函数
利用FSO取得BMP,JPG
FileSystemObje
fso使用:drive 读取
fso:folder 文件系
fso:file 文件对象
scripting.Text
ASP实现结构化列举并查看某
Adodb.Stream
ASP 批量文件改名
 推荐文章
 
asp无组件读取图片文件信息
限制(禁用)FSO组件的方法
fso使用例子:创建文件夹
fso:file 文件对象
fso应用中的几个小函数
ASP FSO相关的一些例子
fso的一些特殊功能
FSO读取网站系统使用空间的
使用FSO修改文件夹的名称
fso复制文件夹所有内容和删
FSO操作文件系统代码
稻香老农的无组件上传类(完整
一个基于Jscript和fs
无惧 无组件上传完整代码
asp静态模版技术之标签参数
无组件上传文件被杀毒软件误报
 
你现在的位置:您现在的位置是: 中国ASP>>ASP教程>>fso组件
稻香老农的无组件上传类(完整带进度条版本)

化境ASP无组件上传类 - upload_5xsoft 使用手册 2.0
what"s new 


1.使用了网友“梁无惧” 提供的高效的处理方式,上传速度可提高一倍以上,可上传更大的文件。

2.添加了form 方法和file方法,把原来的 form 集和 file改为 objForm 和 objFile,避免了若上传时没有数据会出错的Bug。

3.对多选框的优化,上传同名的多选框时,会自动用 ", " 连接起来。

4.对于表单名,不再区分大小写,使用ASP使用者更习惯。


关于 upload_5xsoft


一直以来,由于FileSystemObject的局限,所以ASP最大的难题就是文件上传,大多解决法就是安装

第三方上传组件。可第三方组件有很多问题,有的组件要注册,有的组件要在表单中加上他的版权信息。

还有的就是组件的兼容问题。

   在网上也流传了很多无组件上传的代码,但都是只能上传文本文件,或是只能将文件上传到数据库中。

我这段时间在研究ASP,发现可以不用第三方组件上传任意类型的文件。就写了这个类,给大家一

个方便,整个类放在一个文件中: upload_5xsoft.inc 在 Example 目录下还有一个完整的多文件上传示

例程序,可以直接使用。

申明:源代码是完全开放的,可能随意传播,但请保留其完整性,未经作者同意,不得用于商业。

 

运行平台与注意事项

a)可直接运行于 Windows2000+IIS 5
NT4 或是 Win98+PWS, 要安装ADO2.6 下载地址:http://www.microsoft.com/data/:
<!--#include FILE="upload_5xsoft.inc"--> 就行了


b) 在使用文件上传时, 表单 form 要加上 enctype="multipart/form-data" 即:

<form name="form1" method="post" action="" enctype="multipart/form-data">
<input type="text" value="abc" name="text1">
<input type=file name="file">
<input type=submit name="submit" value="提交">
</form>


upload_5xsoft的对象

如定义一个上传对象
<!--#include FILE="upload_5xsoft.inc"-->
<%
set upload=new upload_5xsoft "upload就是一个对象
%>

upload_5xsoft 对象成员
File 方法,得到文件对象,例如:set file=upload.file("file1")

文件对象成员下面有说明
objFile 文件对象集,(是个dictionary对象)
 
文件对象成员:
Count 属性,文件表单的个数
FileName 属性,上传文件的名字
FileSize 属性,上传文件的大小(为0是表示没有文件)
FilePath 属性,上传前文件所在的路径
FormName 属性,文件表单的名字
SaveAs 方法,储存上传后文件,有一个参数,路径要为真实路径如:
例子: set file=upload.file("file1") "file1为表单名

response.write "<br>文件名:"&file.FileName

response.write "<br>文件大小:"&file.FileSize

response.write "<br>文件路径:"&file.FilePath

file.saveAs Server.mappath("/1.jpg")

set file=nothing
Form 方法,获得表单数据,如 Response.Write upload.Form("abc")
objForm 表单数据集,(是个dictionary对象)用来代替 Request.Form
count 属性,表单数
exists 方法,检查是否有指定的表单名
更多的用法可看 vbscript 的dictionary对象帮助
例子:
"得到text1表单的数据,uplaod就是一开始创建的对象

sText=upload.form("text1") 
Version 属性,upload_5xsoft类的版本号,如:

response.write upload.Version

 

使用示例

1.上传一个jpg文件的示例:

文件1: upload.htm

<html><title>example</title>
<body>
<form name="form1" method="post" action="upload.asp" enctype="multipart/form-data">
<input type=file name="file1">
<input type=submit name="submit" value="提交">
</form>
</body>
</html>

文件2: upload.asp

<html><title>example</title>
<body>
<!--#include FILE="upload_5xsoft.inc"-->
<%
set upload=new upload_5xsoft
set file=upload.file("file1")
response.write upload.form("submit")&"<br>"
if file.fileSize>0 then
 file.saveAs Server.mappath("temp.jpg")
 response.write "<br>上传文件:"&file.FileName&" => temp.jpg OK!"
 response.write "<br>文件大小:"&file.FileSize
end if
set file=nothing
set upload=nothing
%></body>
</html>

2.列表出有文件表单(多文件上传)
<html><title>example</title>
<body>
<!--#include FILE="upload_5xsoft.inc"-->
<%
set upload=new upload_5xsoft

""列出所有form数据
for each formName in upload.objForm
response.write formName&"="&upload.objForm(formName)&"<br>"
next

""列出所有文件
for each formName in upload.objFile
 set file=upload.objFile(formName)
 if file.FileSize>0 then
  file.SaveAs Server.mappath(file.FileName)
  response.write file.FilePath&file.FileName&" ("&file.FileSize&") => "
  response.write file.FileName&" 成功!<br>"
 end if
 set file=nothing
next
set upload=nothing
%>


若程序有问题,请写作者联系 getc@163.com

稻香老农 2003年 1月8日

 

首先是为了完成上传并且显示进度条所需要的四个包含文件,放入include文件夹

1、wang_upload_5xsoft.inc

<SCRIPT RUNAT=SERVER LANGUAGE=VBSCRIPT>
dim Data_5xsoft

Class upload_5xsoft
 
dim objForm,objFile,Version
"------------------------begin add by mytju.com----------------------------
dim mProgressID,tempFileName
Public Property Get ProgressID()
 ProgressID=mProgressID
End Property

Public Property Let ProgressID(byVal itemValue)
 mProgressID=itemValue
End Property
"-----------------------end add by mytju.com-----------------------------
Public function Form(strForm)
   strForm=lcase(strForm)
   if not objForm.exists(strForm) then
     Form=""
   else
     Form=objForm(strForm)
   end if
 end function

Public function File(strFile)
   strFile=lcase(strFile)
   if not objFile.exists(strFile) then
     set File=new FileInfo
   else
     set File=objFile(strFile)
   end if
 end function


Public Sub GetUpFile "-----------change by mytju.com------------------------------
  dim RequestData,sStart,vbCrlf,sInfo,iInfoStart,iInfoEnd,tStream,iStart,theFile
  dim iFileSize,sFilePath,sFileType,sFormValue,sFileName
  dim iFindStart,iFindEnd
  dim iFormStart,iFormEnd,sFormName
  dim readBlock,readBlockSize,upBytes
  Version="化境HTTP上传程序 Version 2.0"
  set objForm=Server.CreateObject("Scripting.Dictionary")
  set objFile=Server.CreateObject("Scripting.Dictionary")
  if Request.TotalBytes<1 then Exit Sub
  set tStream = Server.CreateObject("adodb.stream")
  set Data_5xsoft = Server.CreateObject("adodb.stream")
  Data_5xsoft.Type = 1
  Data_5xsoft.Mode =3
  Data_5xsoft.Open
"------------------------modify begin by mytju.com------------------------------
 "---create xml File--------------------
 Dim objFSO, objTextFile
 Set objFSO = Server.CreateObject("Scripting.FileSystemObject")
 tempFileName=objFSO.GetSpecialFolder(2)&"\upload_"&mProgressID&".xml"
 Set objTextFile = objFSO.CreateTextFile(tempFileName, True)
 objTextFile.WriteLine("<?xml version=""1.0"" encoding=""gb2312""?>")
 objTextFile.WriteLine("<tree>")
 objTextFile.WriteLine("<fileUpProgress myID=""1"">")
 objTextFile.WriteLine("<BytesTransferred>0</BytesTransferred>")
 objTextFile.WriteLine("<TotalBytes>0</TotalBytes>")
 objTextFile.WriteLine("<useTime>1</useTime>")
 objTextFile.WriteLine("</fileUpProgress>")
 objTextFile.WriteLine("</tree>")
 objTextFile.Close
 Set objTextFile = Nothing
 Set objFSO = Nothing
 "---start to upload---------------------
 upBytes=0
 readBlockSize=1024*100
 startTime=Timer()
 readBlock=Request.BinaryRead(readBlockSize)
 "---create xmlDom------------------------
 set objDOM = Server.CreateObject("Microsoft.XMLDOM")
 objDOM.async = false
 objDOM.load tempFileName
 Set objRoot = objDom.documentElement
 Set objField = objRoot.selectSingleNode("/tree/fileUpProgress[@myID=1]")
 "---loop to get data--------------------
 while Lenb(readBlock)>0
  upBytes=upBytes+Lenb(readBlock)
  "--save value---------
  objField.childNodes.item(0).text=Cstr(upBytes)
  objField.childNodes.item(1).text=Cstr(Request.TotalBytes)
  objField.childNodes.item(2).text=Cstr(Timer()-startTime)
  objDom.save tempFileName
  "--write to Stream-----
  Data_5xsoft.Write readBlock
  readBlock=Request.BinaryRead(readBlockSize)
 wend
 Set objField = Nothing
 Set objRoot = Nothing
 Set objDom = Nothing
"------------------------modify end by mytju.com------------------------------
  Data_5xsoft.Position=0
  RequestData =Data_5xsoft.Read

  iFormStart = 1
  iFormEnd = LenB(RequestData)
  vbCrlf = chrB(13) & chrB(10)
  sStart = MidB(RequestData,1, InStrB(iFormStart,RequestData,vbCrlf)-1)
  iStart = LenB (sStart)
  iFormStart=iFormStart+iStart+1
  while (iFormStart + 10) < iFormEnd
 iInfoEnd = InStrB(iFormStart,RequestData,vbCrlf & vbCrlf)+3
 tStream.Type = 1
 tStream.Mode =3
 tStream.Open
 Data_5xsoft.Position = iFormStart
 Data_5xsoft.CopyTo tStream,iInfoEnd-iFormStart
 tStream.Position = 0
 tStream.Type = 2
 tStream.Charset ="gb2312"
 sInfo = tStream.ReadText
 tStream.Close
 "取得表单项目名称
 iFormStart = InStrB(iInfoEnd,RequestData,sStart)
 iFindStart = InStr(22,sInfo,"name=""",1)+6
 iFindEnd = InStr(iFindStart,sInfo,"""",1)
 sFormName = lcase(Mid (sinfo,iFindStart,iFindEnd-iFindStart))
 "如果是文件
 if InStr (45,sInfo,"filename=""",1) > 0 then
  set theFile=new FileInfo
  "取得文件名
  iFindStart = InStr(iFindEnd,sInfo,"filename=""",1)+10
  iFindEnd = InStr(iFindStart,sInfo,"""",1)
  sFileName = Mid (sinfo,iFindStart,iFindEnd-iFindStart)
  theFile.FileName=getFileName(sFileName)
  theFile.FilePath=getFilePath(sFileName)
  "取得文件类型
  iFindStart = InStr(iFindEnd,sInfo,"Content-Type: ",1)+14
  iFindEnd = InStr(iFindStart,sInfo,vbCr)
  theFile.FileType =Mid (sinfo,iFindStart,iFindEnd-iFindStart)
  theFile.FileStart =iInfoEnd
  theFile.FileSize = iFormStart -iInfoEnd -3
  theFile.FormName=sFormName
  if not objFile.Exists(sFormName) then
    objFile.add sFormName,theFile
  end if
 else
 "如果是表单项目
  tStream.Type =1
  tStream.Mode =3
  tStream.Open
  Data_5xsoft.Position = iInfoEnd
  Data_5xsoft.CopyTo tStream,iFormStart-iInfoEnd-3
  tStream.Position = 0
  tStream.Type = 2
  tStream.Charset ="gb2312"
         sFormValue = tStream.ReadText
         tStream.Close
  if objForm.Exists(sFormName) then
    objForm(sFormName)=objForm(sFormName)&", "&sFormValue   
  else
    objForm.Add sFormName,sFormValue
  end if
 end if
 iFormStart=iFormStart+iStart+1
 wend
  RequestData=""
  set tStream =nothing
End Sub

Private Sub Class_Terminate
 if Request.TotalBytes>0 then
 objForm.RemoveAll
 objFile.RemoveAll
 set objForm=nothing
 set objFile=nothing
 Data_5xsoft.Close
 set Data_5xsoft =nothing
 end if
End Sub
  
 
 Private function GetFilePath(FullPath)
  If FullPath <> "" Then
   GetFilePath = left(FullPath,InStrRev(FullPath, "\"))
  Else
   GetFilePath = ""
  End If
 End  function
 
 Private function GetFileName(FullPath)
  If FullPath <> "" Then
   GetFileName = mid(FullPath,InStrRev(FullPath, "\")+1)
  Else
   GetFileName = ""
  End If
 End  function
End Class

Class FileInfo
  dim FormName,FileName,FilePath,FileSize,FileType,FileStart
  Private Sub Class_Initialize
    FileName = ""
    FilePath = ""
    FileSize = 0
    FileStart= 0
    FormName = ""
    FileType = ""
  End Sub
 
 Public function SaveAs(FullPath)
    dim dr,ErrorChar,i
    SaveAs=true
    if trim(fullpath)="" or FileStart=0 or FileName="" or right(fullpath,1)="/" then exit function
    set dr=CreateObject("Adodb.Stream")
    dr.Mode=3
    dr.Type=1
    dr.Open
    Data_5xsoft.position=FileStart
    Data_5xsoft.copyto dr,FileSize
    dr.SaveToFile FullPath,2
    dr.Close
    set dr=nothing
    SaveAs=false
  end function
  End Class
</SCRIPT>

 

2、fileUpProgress.asp

<% @codepage=936 EnableSessionState=False%>
<HTML xmlns:v>
<HEAD>
<META http-equiv="Content-Type" content="text/html; charset=gb2312">
<TITLE>文件上传进度指示条</TITLE>
<STYLE>
v\:*{behavior:url(#default#VML);}
*{font-size:12px;}
</STYLE>
<style type="text/css">
<!--
font {
 font-size: 14px;
}
td {
 font-size: 14px;
 color: #333333;
}
b {
 font-size: 14px;
}
span {
 font-size: 14px;
}
a:link {
 color: #333333;
 text-decoration: none;
}
a:hover {
 color: #990000;
 text-decoration: underline;
}
a:visited {
 color: #000000;
 text-decoration: none;
}
-->
</style>
</HEAD>
<BODY topmargin="0" leftmargin="0" onLoad="begin()" bgcolor="#CCCCCC">
<p><br>
<table width="100%" border="0" cellspacing="0" cellpadding="4">
  <tr>
    <td align="center"><b>文件上传进度指示条</b></td>
  </tr>
  <tr>
    <td>状态:<span ID="myStatus"></span></td>
  </tr>
  <tr>
    <td width="500"><div style="table-Layout:fixed;width:100%;height:100%;border:1 solid black"><v:RoundRect id="myRect" style="height:20;" name="myRect">  <v:fill type="gradient" id="fill1" color="blue"/> </v:RoundRect></div></td>
  </tr>
  <tr>
    <td>已经上传:<span ID="message"></span></td>
  </tr>
  <tr>
    <td>使用时间:<span ID="time">0</span> 秒 </td>
  </tr>
  <tr>
    <td>平均速率:<span ID="speed">0</span> KB/秒 </td>
  </tr>
</table>
<script language="Javascript">
self.moveTo(getTop(200),getLeft(500));
var intBytesTransferred=0;
var intTotalBytes=0;
var useTime=1; //s
var getData;
var myWidth=486;
var beginUploadFlg=false;
fill1.color="rgb("+Math.round(Math.random()*255)+","+Math.round(Math.random()*255)+","+Math.round(Math.random()*255)+")";
myStatus.innerHTML="正在初始化....";
function begin()
{
 message.innerHTML="开始获取信息....";
    var Doc = new ActiveXObject("Microsoft.XMLDOM");
    Doc.async = false;
    Doc.load("fileUpProgressRead.asp?progressID=<%=Request.QueryString("progressID")%>&aa="+new Date().getTime());
 if(Doc.parseError.errorCode != 0) //检查获取数据时是否发生错误
 {
  delete(Doc);
  if(beginUploadFlg){
   intBytesTransferred=intTotalBytes;
  }else{
   message.innerHTML="上传动作尚未启动!";
  }
 }else{
     var rootNode=Doc.documentElement;
     if(rootNode.childNodes != null) 
     {     beginUploadFlg=true;
           intBytesTransferred=Number(rootNode.childNodes.item(0).childNodes.item(0).text);
           intTotalBytes=Number(rootNode.childNodes.item(0).childNodes.item(1).text);
           useTime=Number(rootNode.childNodes.item(0).childNodes.item(2).text);
           message.innerHTML="获取信息成功。";
     }
     delete(rootNode);
 }
 delete(Doc);
    if(intTotalBytes==0){
  intBytesTransferred=1;
  intTotalBytes=100;
 }
 display();
 if(intTotalBytes>0 && intBytesTransferred<intTotalBytes){
  if(beginUploadFlg){
   myStatus.innerHTML="正在上传,请耐心等待....";
  }
  time.innerHTML=useTime;
  speed.innerHTML=Math.round((intBytesTransferred/useTime)/1024);
  getData = setTimeout("begin()",1000);
 }else{
  myStatus.innerHTML="数据上传完毕,3秒后自动关闭。";
  setTimeout("self.close()",3000);
 }
}
function display(){
 myRect.style.width=Math.round(myWidth/(intTotalBytes/intBytesTransferred));
 fill1.angle=Math.round(300/(intTotalBytes/intBytesTransferred));
 if(beginUploadFlg){ 
  message.innerText=intBytesTransferred+"/"+intTotalBytes+","+Math.round(100/(intTotalBytes/intBytesTransferred))+"%";
 }
}
function getTop(windowHeight){
  var top = parseInt((screen.height - windowHeight)/2-15);
  return top;
}
 
function getLeft(windowWidth){
  var left = parseInt((screen.width - windowWidth)/2-5);
  return left;
}
</script>
</BODY>
</HTML>

3、fileUpProgressRead.asp

<% @codepage=936 EnableSessionState=False%>
<%
Set fso = Server.CreateObject("Scripting.FileSystemObject")
mProgressID=Request.QueryString("progressID")
filePath=fso.GetSpecialFolder(2)&"\upload_"&mProgressID&".xml"
Set f = fso.OpenTextFile(filePath,1)
response.write f.ReadAll
set f=nothing
set fso=nothing
%>

4、randomString.asp

<% Function gen_key(digits)
    dim char_array(80)
    For i = 0 To 9
        char_array(i) = CStr(i)
    Next
    For i = 10 To 35
        char_array(i) = Chr(i + 55)
    Next
    For i = 36 To 61
        char_array(i) = Chr(i + 61)
    Next
 Randomize
 do while len(output) < digits
        num = char_array(Int((62 - 0 + 1) * Rnd + 0))
        output = output & num
    loop
    gen_key = output
End Function %>

 

下面的文件 在include文件夹外面

测试页面

5、test_upload.asp

<!--#include file="include/randomString.asp" -->
<% ProgressID = gen_key(10) %>
<meta HTTP-EQUIV=Content-Type content="text/html; charset=gb2312">
<form action="test_uploadSave.asp" method="post" enctype="multipart/form-data" onSubmit="myOpen(this)">
文件:<INPUT name="file" type="file"  size="20">
文本:<INPUT name="text" type="text"  size="20" >
<input type="submit" value="submit">
</form>
<script>
function myOpen(form){
 window.open("include/fileUpProgress.asp?progressID=<%=ProgressID%>","","width=500,height=200,scrollbars=no,toolbar=no,status=no,resizable=no,menubar=no,location=no");
 var url=form.action;
 if (url.indexOf("?",0)==-1) {
  form.action = url+"?progressID=<%=ProgressID%>";
 }else{ 
  form.action = url+"&progressID=<%=ProgressID%>";
 }
}
</script>

6、test_uploadSave.asp

<%@ CODEPAGE="936"%>
<!--#include file="include/wang_upload_5xsoft.inc" -->
<META http-equiv="Content-Type" content="text/html; charset=gb2312">
<%
Server.ScriptTimeOut=300
"--注意下面是写法稍有不同的地方---
set upload=new upload_5xsoft
upload.ProgressID=Request.QueryString("progressID") "一定是这行在先。
upload.GetUpFile
"--结束---其他与以前的写法完全相同-------------
response.write upload.form("text")

set file=upload.file("file")
file.saveas Server.mappath(".")&"\"&file.fileName
set upload=nothing
%>
<br>----------ok-----------

 

改程序由蓝色理想的萧萧小雨提供。

作者站点:

http://www.mytju.com

 


相关信息:

fso操作文件 实例函数
利用FSO取得BMP,JPG,PNG,GIF文件信息
FileSystemObject对象成员概要
fso使用:drive 读取驱动器信息
fso:folder 文件系统
fso:file 文件对象
scripting.TextStream对象-fso读写文本
ASP实现结构化列举并查看某路径下所有文件

 

中国ASP技术 ASP.ORG.CN 版权所有 2004-2008