·当前位置:建站学院asp技术asp应用 → ADODB.stream做上传的问题
ADODB.stream做上传的问题
日期:2005年4月17日 作者: 人气: 查看:[大字体 中字体 小字体]
现在好多网站上都流行一个叫“东方蜘蛛”写的只用6行代码实现的无组件上传工具但实际上它是错误的。
据说该老兄也是CHINAASP上的网友。没有找到他的老贴子,所以把看到的东西贴出来供大家分析一下:

目前有很多无组件上传类,我大概看了一下,大多写的相当复杂,有的居然还只能传文本
  最关键的是没有10行代码以下的 :)
  我花了一个晚上时间研究了一下ADODB.Stream,并且用了6行代码实现了无组件上传:

  strFileName = Request.QueryString("file1")
  Set objStream = Server.CreateObject("ADODB.Stream")
  objStream.Type = 1 ’ adTypeBinary
  objStream.Open
  objStream.LoadFromFile strFileName
  objStream.SaveToFile Server."123_onweb.gif",2

  使用方法:

  把上面的代码写成upload.asp
  在浏览器里面输入:
  http://XXX/upload.asp?file1=c:\上传文件\123.gif
  XXX为你的主机地址
  执行完后你会看到你的目录下面多了一个123_onweb.gif
  他就是你要文件拉!!!!

  根据原理我们可以扩展以下代码:
  upload.asp文件
  <%
  Function GetFileName(ByVal strFile)
  If strFile <> "" Then
   GetFileName = mid(strFile,InStrRev(strFile, "\")+1)
  Else
   GetFileName = ""
  End If
  End  function

  strFileName = Request.Form("file1")
  Set objStream = Server.CreateObject("ADODB.Stream")
  objStream.Type = 1 ’ adTypeBinary
  objStream.Open
  objStream.LoadFromFile strFileName
  objStream.SaveToFile Server.MapPath(GetFileName(strFileName)),2
  objStream.Close
  %>

  upload.htm文件
  <form name="FORM" action="upload.asp" method="post">
  <input type="submit" name="submit" value="OK">
     <input type="file" name="file1" style="width:400"  value="">
  </form>

-------------------------------------------------------
    这段代码是错误的!!!大家不要使用它!
    作者可能只在本机调试过,但实际上它不能通过网络工作。
    ADODB.Stream对象的LoadFromFile方法读取的是本机的绝对路径,如果写在ASP代码中,那么所谓的本机是指服务器,而不是通过浏览器上网的客户机。调试时如果在本机用IIS发布的话,当然能工作,因为存在相同的路径和文件。实际使用时,这个程序是十分失败的,作者犯了概念性错误。不可以用stream读客户端数据。因此这个程序是失败的。
    如果要做无组件的上传必须具备以下几个条件,提交的表单form里必须有这两个参数method="post" enctype="multipart/form-data",两个都是必须的。在他的例子里第一个六行程序竟然可以用get方式,并且带着本机路径,这绝对是错误的。没有enctype则发送的格式会不符合上传文件的格式,即file类型的域只能发送文件路径而不带文件内容,无法从客端向服务器上传数据。就是第二段长一点的代码,也没有写这个参数。
    另一个就是要使用Request.BinaryRead来读取全部由表单发来的数据,而不能使用Stream.LoadFromFile,因为网络上数据是从表单数据上提来的,而不是从本机调取的,服务器上要是有,还用上传干什么呢。另外,Request对像在取得表单数据时只能使用字段或二进制两种方式之一进行读取,就是说Request.Form(字段名)和Request.BinaryRead两者只能用其中一种,当一种使用之后,另一种就不能用了,所以一旦用二进制读取了表单内容,随上传一起提交的其它表单项就不能通过Request.Form(字段名)的方法来简单的取得了,而要通过复杂的字符串运算才能取得,这才是网上大部分无组件上传代码都很长的原因,分离表单这部分占去了程序绝大多数部分,真正的接受数据和保存等代码其实却只有几行。这也是为什么所有的上传组件都带有一个.Form集合了,因为组件里如果不做这个处理,我们将无法得到和表单一起提交的其它数据。
    最后,使用Stream.SaveToFile来保存数据,就这一点原作者写对了,因为FSO不能写二进制,而流格式可以支持二进制和文本两种模式,所以在部分上传组件里,我们可以看到可选择使用文本或二进制上传方式的选项。其实就算是文本文件,我们把它当作二进制文件来传输,一般也是不会出问题的,至少我还没有遇到过,所以可以不必做这个选项,全部都按二进制来操作就行了。

(出处:互联网)

相关文章:
·利用ASP.NET设计FTP文件上传(純前臺代碼)
·代码共享:纯ASP文件上传(不用组件的哦)
·ASP.NET文件上传程序的源代码
·将复合控件子控件事件上传到顶层的例子将复合控件子控件事件上传到顶层的例子
·ASP.NET中上传文件到数据库
·在ASP.NET中实现多文件上传
·ASP.NET中上传文件的方法(一)
相关软件:
·先锋无组件上传类(无惧2.0杜绝上传漏洞修改版) v2004.rar
·爱雪儿无组件上传类 v1.0
·风声无组件上传类 v2.08 Beta1
·留溪网上传文系统
·ASP.NET 大文件上传组件
· 文件上传
·Delphi写ASP组件实现快速多文件WEB上传
· 截获视频并以mpeg4格式在网上传输的程序
· VideoTrans(截获视频并以mpeg4格式在网上传输的程序)
·留溪网上传文系统 v1.1
 → 特别推荐
 → 热点TOP10