• 10069阅读
  • 8回复

sunyuting1-如何上传网站文件(详解)?作者:自由勇

级别: 总版主
http://www.webshu.com/tutorial/tor/7,id=0201.htm

如何上传网站文件(详解)?作者:自由勇?点击:MT-8000?更新 2003-09-19
??上传文件请不要用FrontPage或Dreamweaver自带的站点发布功能。
??首先,要确定,你的空间是否支持FTP;你的电脑是否局域网?如果你的空间是收费空间,就一定支持FTP;如果是免费空间,几乎全都不支付FTP了。什么是FTP?是英文File Transfer Protocol的简称,即文件传输协议。FTP可一次操作之后即上传多个文件,或多个文件夹、或整个网站。如果不支持FTP的话,就只能用Web登录上传了。

??FTP上传有很多种软件,最著名的是CuteFTP和LeapFTP,也可以用我们的资源管理器来上传,但是速度要比CuteFTP或LeapFTP慢很多。下面详细说明一下如何上传文件,比如我的信息如:
用户名:ziyouyong
密码:123456
服务器地址:http://www.ziyouyong.com/ 或 211.154.150.99

??一、如何用资源管理器上传。打开IE浏览器,输入“ftp://用户名:密码@服务器地址”,所以我应该输入ftp://ziyouyong:123456@www.ziyouyong.com/,或者输入ftp://ziyouyong:123456@211.154.150.99/,如下图:



??然后就可以从本地的资源管理器直接把文件或文件夹复制上去,这是最简便的方法,我也极常用。如果你的电脑是局域网,不是主机的话,就不能用这种方法。
??这种方法的麻烦之处在于会泄露密码,解决办法有2个,一是直接输入“ftp://错误的用户名:错误的密码@服务器地址”,这样会提示输入密码;或者清空历史记录,WinXP清空历史记录并不那么容易,必须在\Documents and Settings\计算机用户名\Local Settings\History 才能找到,并删除“今天”的文件夹。

??二、CuteFTP。这是最著名的FTP软件之一。请点击这里下载:http://www.google.com/search?q=CuteFTP&hl=zh-CN&lr=lang_zh-CN,然后安装。
??CuteFTP已经有很多种版本了,每个版本操作方法几乎都一样,以前我用的是4.2.3的,下面以CuteFTP XP V5.0.1为例:启动之后,按一次F4键,打开站点管理器,如下图:



???请注意:这里主要针对收费用户:
??1.在站点标签处可任意填。
??2.FTP主机地址填写主机名,一般是你的域名,例如http://www.ziyouyong.com/,也可以填写虚拟主机的IP。
??3.FTP 站点用户名称,填写用户名。各个主机提供商的用户名大不一样,例如有的是以域名命名的,如kkk.com。新网chinadns用户多是web80000这样的形式。
??4.填写密码。
??5.FTP站点端口连接(port)填写21,默认的也是21。
??6.登录类型选为普通比较好,每次打开FTP都不用输入密码。如果选为匿名,则每次登录都要输入密码。
??注:上述2~4点中,主机名、用户名、密码都是空间提供商告诉你的,你可以找到主页开通时那封通知信,上面有写。要更改FTP密码,需要跟他们联系。

???然后按一下连接(C)键,就开始连接FTP。连接成功后,把文件从左边的窗口拖动到右边,即开始上传,可以同时选中多个文件、文件夹,甚至整个网站可以一次上传。先把文件选中,点击鼠标右键→上传,如下图:
???下次再上传的时候,只要按一次连接(C)键即可。



??注意,本地文件夹要和远程文件夹的路径保持一致,文件夹不能用中文,要区分英文大小写。打开一个文件夹的方法是双击该文件夹,点击右上角的└键表示向上一级目录。

??三、LeapFTP与CuteFTP操作方法几乎完全一样,可点击这里下载,我使用LeapFTP更多一些,主要是出于习惯。

??局域网上传网页的问题。局域网上传网页比较麻烦,只有使用CuteFTP XP 5.0版本以上才有可能,因为只有这些版本才支持Socks设置。打开CuteFTP的菜单栏:编辑→设置→连接,展开后可看到Socks。选择Sock5,IP填写局域网内部主机的IP,但前提是,这台主机必须安装有**********软件。局域网的电脑上传文件确实是相当困难的,实在不行的话,就找那台主机上传。如果你是独享一条ADSL的话,就没问题了。




网页树树版权声明:
此文为Webshu.com独家撰稿,著作权属作者所有。
传统媒体、公众站点转载请事先联系Webshu编辑。
个人主页未经许可,禁止转载。
此文网址 http://www.webshu.com/tutorial/tor/7,id=0201.htm



如果您已阅读完毕:
欢迎对此文发表留言




欢迎发表您的留言:Take a message...


°自由勇 2003-09-19 16:43
??感谢阅读!在上传过程中遇到什么问题,请与空间服务商联系。


--------------------------------------------------------------------------------

?自由勇 2003-09-19 17:19
??有任何问题,欢迎到这里提问,我会作出答复http://www2.webshu.com/effort/main.asp


--------------------------------------------------------------------------------

?syschen 2003-09-25 16:31
??你好!自由勇,我想在我的首页放一点背景音乐,这个音乐文件是不是也要先上传上去呢?我的空间是免费的,我的不是主机.http://www2.webshu.com/effort/main.asp这个网址我打不开呀!


--------------------------------------------------------------------------------

?自由勇 2003-09-25 16:34
??是的,也要上传。这个网址可以访问的,请把地址前面的空格去掉就可以了,或者点击最上面的导航条“咨询中心”、“新手论坛”。


--------------------------------------------------------------------------------

?甲客虫 2003-10-17 14:18
??你好!自由勇,我是一位新手。我上传是网页怎么打不开http://www.hongfei88.zj.com/ 我的空间是免费的.望你指点


--------------------------------------------------------------------------------

?甲客虫 2003-10-17 14:20
??上面显示“HTTP 404 - 未找到文件 Internet Explorer ”


--------------------------------------------------------------------------------

?自由勇 2003-10-17 14:25
??甲客虫好!可能是你的文件没有上传,因为zj.com只免费提供一个二级域名,并有解析功能。但是空间要另外去其它网站申请,也就是说域名是免费的,但空间是收费的。


--------------------------------------------------------------------------------

?甲客虫 2003-10-17 16:48
??自由勇,我在都市家园已申请个人空间,并且用你所说资源管理器上传的办法打开,里面已有我上传的文件夹


--------------------------------------------------------------------------------

?自由勇 2003-10-17 16:51
??请联系zj.com的管理员。注意首页文件名必须是index.htm或index.html等等。


--------------------------------------------------------------------------------

?甲客虫 2003-10-22 09:28
??自由勇,我上传的图片打不开是怎么回事


--------------------------------------------------------------------------------

?冰蓝 2003-10-24 20:44
??如果要代理呢,怎么设呀,我的空间是国外的,但我用的是教育网,不用代理连不上,可以介绍一下用FlashXP设置代理上传吗,我用的是FlashXP ^-^


--------------------------------------------------------------------------------

?冰蓝 2003-10-28 11:18
??怎么没人理我呀!


--------------------------------------------------------------------------------

?花花 2003-11-03 16:06
??自由勇,我的空间是国外的,为什么老是连不上,主机地址是不是填我的主页地址??谢谢!


--------------------------------------------------------------------------------

?龙卷风 2003-11-17 18:48
??你好!我用了好几个ftp上传工具,可都不行。我这个空间现在是试有期。还没交费。多谢了!!


--------------------------------------------------------------------------------

?自由勇 2003-11-22 11:03
??冰蓝好!代理比较麻烦,CuteFTP的Sock代理不像QQ那么好用,只能多试一下。
??花花好!国外空间经常是这样的,或者是你的空间不支持FTP。
??龙卷风好!用LeapFTP和CuteFTP最好。


--------------------------------------------------------------------------------

?lin 2003-11-23 12:10
??你好,我做了一个ASP论坛,是不是也要把整个文件夹传上去才能让人看到?谢谢回答!


--------------------------------------------------------------------------------

?自由勇 2003-12-13 11:13
??lin好!是的,需要全部上传。

提示:此页已结束会话,感谢您的参与。欢迎点击此处继续发表留言>>






关于我们 :: 服务项目 :: 使用帮助 :: 版权信息 :: 网站地图 :: 友情链接 :: 信息反馈
Copyright © 2003-2004 webshu.com 版权所有?E-mail to webshu.com



我喜欢千万法,我用压码和右脑给千万别学英语一个杠杆,撬起零基础到达自由王国;压码只有一个指标:通过滞后提高速度,速度就是质量,给它注入一个加速器,就会产生一个个奇迹.
[楼 主] | Posted:2005-04-17 05:29|
级别: 总版主
只看该作者 1 发表于: 2005-11-28
嵌入开发网的上传文件

http://www.embed.com.cn/download/manage/upload.asp

========= 文件上传 =========
发布者: *
选择文件: *
文件标题: * (例:Linux启动介绍文档)
文件类别: 技术资料 软件 协议文档 问题求助与解答 其它 *
使用说明:  
相关网址: (例:http://www.abc.com.cn/)
   

为尊重知识产权,请勿上载与盗版有关的文件


--------------------------------------------------------------------------------
注意事项:
您在上传文件时,请注意不要传送跟本站主题无关的内容,请尽量写清楚文件上传的目的和基本介绍文字,发布者、文件标题和文件类别必须填写。
如果您在论坛内参与讨论的内容涉及到上传文件,可告诉大家到用户文件交流区来下载 “http://www.embed.com.cn/download/userfiledownlist.asp”。为管理和安全考虑,本系统自动将上传文件改名。
此上传系统,除.asp以外任何文件格式都可上传,如上传自己编写的可执行程序,为大家的利益请一定查清是否符合安全。
本自由上载区纯粹为方便用户交流探讨开设,如因用户下载而造成的任何损失,嵌入开发网不负任何责任。另禁止上载广告宣传品,一经发现即删除。
禁止上载任何侵害他人专利权、商标权、商业秘密、版权或其他专有权利的内容。嵌入开发网对用户上载文件不作任何承诺及不承担任何责任。



--------------------------------------------------------------------------------
关于本网 | 版权声明 | 广告服务 | 联系我们 | 站点地图

©版权所有 深圳市英蓓特信息技术有限公司



我喜欢千万法,我用压码和右脑给千万别学英语一个杠杆,撬起零基础到达自由王国;压码只有一个指标:通过滞后提高速度,速度就是质量,给它注入一个加速器,就会产生一个个奇迹.
[1 楼] | Posted:2005-04-17 05:36|
---------------------------------------------------------------
ASP与上传文件专题 (共17篇)

http://www.6to23.com/s11/s11d5/show1.htm
首页>>> ASP技术>>>ASP与上传文件专题 (共17篇)
最新[1]




?通过Adodb.Stream取得图像
?关于Adodb.Stream 的使用说明

?常用Email组件发送函数
?IEWebBrowser组件的execWB方法

?文件上传组件的一些比较和说明
?图片与文本同存在数据库的具体思路

?行家看用ASP上传文件
?检查当前目录下是否存在指定的文件

?asp+发送email
?计算文件下载时间

?用ASP和VBScript上载文件(一)
?用ASP和VBScript上载文件(二)

?不用组件上载文件代码具体例子
?不用组件上载文件代码段

?用VB6做一个简单的文件上传组件二
?支持中文的无组件文件上传

?支持中文的无组件文件上传-- 示例




    ASP 技术资料库

ASP精彩问答
ASP文摘大全
ASP与数据库专题
ASP与上传文件专题
ASP组件专题

    ASP 下载

程序与代码
组 件
工 具
教 程



关于我们 用户服务 合作联系 你的建议 网络广告服务 友情链接 设为首页



我喜欢千万法,我用压码和右脑给千万别学英语一个杠杆,撬起零基础到达自由王国;压码只有一个指标:通过滞后提高速度,速度就是质量,给它注入一个加速器,就会产生一个个奇迹.
[2 楼] | Posted:2005-04-17 05:42|
------------------------------------------------
文件上传组件的一些比较和说明
--------------------------------------------------------------------------------

http://www.6to23.com/s11/s11d5/20031222113621.htm



文件上传组件的一些比较和说明
2003:12:22 ?来源:5iAsp.Net karry


  介绍现在比较常用的三种上载组件:
  这三种组件都允许用户使用IE3.02以上和Netscape2.0以上版本上载文件
  1。Microsoft的 Posting Acceptor组件
  该组件使用ISAPI这个不用注册的DLL,FORM提交后发给这个dll,该组件能够将文件写入指定目录,同时能够redirect到下一页面。
  当然你必须要对写入的目录具有写入的权限,所以一般用它在win95+pws下通过的程序一放到NT上来就会出现错误,因为它不理解NT的权限和SSL机制。这就意味着不是所有的人都能够随便上载文件甚至根本就没人能够上载文件。
  其次,它不支持把文件写入到数据库中。所以如果你想拥有这个功能,你就需要使用VB6来开发自己的组件。
  再则,它的帮助少得可怜,你还不能够限制上载文件的大小,以及设置用户的权限。
  总之,它除了能够完成把文件保存下来的功能外一无是处。
  2。Persits Software的 ASPUpload组件
  这是一个功能很强大的COM组件,但如果要使用它的完全版需要交费。
  它能够实现以下功能:
  a.限制上载文件的大小
  b.设置用户的权限
  c.修改文件属性
  d.同时上载多个文件
  e.能够将文件保存到数据库中
  f.支持文件删除,自动生成与服务器上文件不同名的文件
  g.拥有管理权限的用户甚至可以使用该控件进行远程注册
  3。Software Artisans的SA-FileUp 组件
  这是最贵和功能最强大的文件上载组件了。
  它的完全版本具备以下功能:
  1。完整的文档,包括丰富的例子程序
  2。给文件上载提供了完善的安全机制
  3。使用ADO方式写入数据库,它还支持VB Web class

总结如下:

Feature        Posting Acceptor   ASPUpload    SA-FileUp
  单用户        Free         $99     $129
  完全版        Free         $300    $1,999
  简单Form提交     Yes         Yes     Yes
  多文件上传      No          Yes     Yes
  和ASP结合程度     No          Yes     Yes
  是否能够处理文件   No          Yes     Yes
  是否支持数据库插入操作No          Yes     Yes
  是否支持ADO      NO          Yes     No
  是否有对ACL的处理   No          Yes     Yes
  是否支持对文件加密  No          No     Yes
  是否支持自动安装   No          No     Yes
  在线帮助       很少         充分    多方面的
  例子程序       很少         一些    很多
  在线帮助       很少         好     很好

建议:
  1。如果你仅仅是想练手,可以使用Posting Acceptor
  2.如果你要实现对网站的解决方案,使用ASPUpload或则SA-FileUp,当然你还可以自己动手编程



我喜欢千万法,我用压码和右脑给千万别学英语一个杠杆,撬起零基础到达自由王国;压码只有一个指标:通过滞后提高速度,速度就是质量,给它注入一个加速器,就会产生一个个奇迹.
[3 楼] | Posted:2005-04-17 05:55|
级别: 总版主
只看该作者 2 发表于: 2005-11-28
http://www.6to23.com/s11/s11d5/2003122211247.htm
行家看用ASP上传文件
2003:12:22 ?来源:7i24.com karry


为什么要上传
HTTP对比 FTP以及其他方法
HTTP上传的形式
RFC1867
HTTP 1.1 Put
WebDAV
用ASP来实现
Posting Acceptor
SA-FileUp
普遍认同的问题
结论
参考


为什么上传?
"瘦客户端"的观念在今天看来是个神话。也许随着电视浏览器或者是掌上型浏览器的繁衍,情况会有
所变化。但是在今天,大量的web客户端使用功能强大的PC,它们拥有很大的存贮空间和许多有趣的客户
端内容。

事实上,文件上传对于任何web应用程序都是很有用的一个功能。以下是我们的一些客户如何在他们的web
应用程序中集成文件上传的例子:

基于web的e-mail使用文件上传在消息中加入附件。
外部网络应用程序使用文件上传在合作对象间发送文件,比如一致性验证、软件更新或者是软件管理。
技术支持站点使用文件上传从用户处接收错误日志和缺陷报告文档。
内部网文档出版使用文件上传,通过友好的web界面在用户间共享文件。
图形库使用文件上传控制提交,并且生成小图标。
ISP经营的店面使用文件上传发送产品图型。
对比其他通过Internet协议将文件发送到中央服务器的方法,基于web的文件上传是一种高级得多的替代手
段。让我们检查一下为什么会这样。


HTTP 对比 FTP
从TCP/IP最早出现,FTP已经成为将文件发送到服务器的标准机制。它很可靠,能够考虑到跨平台的文本和
二进制格式,并且拥有很普遍的客户。然而对比灵活的HTTP,它却有很大的缺陷。让我们比较一下:

认证: 通过FTP上传,你要么需要管理大量的用户帐号,要么允许匿名访问。通过web应用程序上传,
应用程序能够判断谁有资格上传,免去了大量的管理负担。
安全: HTTP上传能够使用SSL编码,以便传输过程中信息是加密的。而标准FTP上传则无此功能。
设置的删除: FTP上传需要管理员精确的调节NTFS权限。基于HTTP的上传结合你的应用程序,使得这
种调节可以根据你的喜好让程序自己决定,同样也能由管理员决定。
灵活性: 想把DOC文件存放在一处,而图形文件存放在另一处吗?使用FTP,你的用户必须知道那些。
而通过web应用程序,你可以在程序中指定好这些方案,改变时也不会打扰你的用户。
功能: 通过一个web应用程序,你可以在上传的文件每次被激活的时候动态限制文件大小。你甚至可以
根据同一个表单中的信息来改变文件大小。除此之外,你还能撤除那些符合特定标准的上传,比如错误
的MIME类型或者错误的文件内容。
简单和友好: 一个好的页面可以提供指示、建议、在线帮助。这对于基于批处理的FTP是不可能的。更
重要的是,当错误发生时,你能即时给用户提供反馈并采取修正方法。
防火墙支持: 许多组织出于安全性和知识产权的考虑,不允许超出范围的FTP。虽然这仅仅是个设置的
问题,但是大多数防火墙允许HTTP上传。
附加信息: 一个HTTP上传(使用RFC1867)产生能够访问的关于上传的额外信息,比如用户的原文件名。
这在内部网的场合会非常有用。
上传至数据库: 服务器端组件,象SA-FileUp,允许你上传到一个OLE DB数据库。用FTP试试看!
性能: FTP和HTTP最终都使用TCP协议,正是它对于传输性能起着主要的决定性因
素。
可靠性和重新开始: FTP和HTTP 1.1都允许传输重新开始。然而不幸的是,许多服务包括IIS目前都还
不支持任何一种协议的重新开始。很明显IIS5将包含FTP重新开始功能。
简言之,象web自身一样,正是在服务器端的可编程性使得HTTP相比较FTP上传而言具有巨大的优势。

HTTP上传的形式
通过HTTP上传有三种机制:RFC1867, PUT 和 WebDAV.

HTTP上传方式1: RFC1867
RFC1867 (http://info.internet.isi.edu/in-notes/rfc/files/rfc1867.txt)
在最终被W3C在HTML3.2
中接受前,是作为一种建议标准。它首先被网景在Navigator2.0中采用,随后被微软作为IE3.02(32位版)的
附件和IE3.03(16位版)的一部分。它是一种非常简单但是功能很强大的想法:在表单字段中定义一个新类型。

<INPUT TYPE=
     "FILE">
并且在表单本身加入了不同的编码方案,不再使用典型的:

<FORM ACTION="formproc.asp" METHOD=
     "POST">
而是使用

<FORM ACTION="formproc.asp" METHOD="POST" ENCTYPE=
     "multipart/form-data">
这种编码方案在传送大量数据的时候,比起缺省的"application/x-url-encoded"表单编码方案,显得效率
要高得多。象你可能会意识到的那样,URL编码只有很有限的字符集。使用任何超出字符集的字符,必须用'%nn'
代替,这里的nn表示相应的2个十六进制数字。例如,即使是普通的空格字符也要用'%20'代替。如果浏览器
不得不使用这种低效的手段对整个文件编码,那么传送的文件会是原始文件的2-3倍大!取而代之,RFC1867
使用多部分MIME编码,就象通常在e-mail消息中看到的那样,不编码来传送大量数据,而只是在数据周围加
上很少的简单但实用的头部。


结果看起来象是通常的HTML的Form Post,但是说起来是4KB的表单数据,却有可能达到上兆字节的长度!
RFC1867也建议浏览器厂商必须采纳对TYPE="FILE"标签提出的几个属性的建议。包括:

ACCEPT: 让web站点在接受文件前限制文件类型。
SIZE: 让站点设置单个文件名文本框的大小或者用一个<INPUT>标签允许多个文件。
MAXLENGTH: 在客户端潜在的设置将要传送的文件的最大长度。
Wildcards and directory uploads: 虽然RFC建议使用通配符或者字典,但IE和
Navigator都不支持
幸运的是,两个浏览器的厂商都采用了建议的“浏览...”按钮,是用户能很容易的使用本地"打开文件..."
对话框选择要上传的文件。

数值项的使用很有趣。通常出于用户方便考虑,让web站点预设表单字段的值是很自然的。但是这样的话,
就会使得不法web站点能够预设要上传的文件名,并伴随一个客户端的表单提交,从而不经过用户的允许就
“窃取”他们PC里的文件。在1997年夏季,CERT协同一名贝尔实验室的雇员,针对这个问题发布了安全性
警告,网景和微软迅速发布补丁来阻止预设文件被上传。
(请见http://www.microsoft.com/ie/security/bell.htm)

这很不幸,因为原本RFC1867就清楚的祥述过“用户代理不应该发送任何用户没有明确要求被发送的文件,这
是非常重要的。”因此,与其整个关掉名字预设功能,倒不如浏览器简单的产生一个警告对话框,比如:“你
想传送文件x,y,z到服务器吗?”。然而作为这件事最后的一个麻烦,10月中旬在IE4.01中发现了另外一个安
全漏洞,这个漏洞能够让web站点绕过IE现有的安全机制。
(见http://www.microsoft.com/windows/ie/security/paste.htm)

HTTP 1.1引入了一个新的HTTP动词:PUT。当web服务器收到一个HTTP PUT和对象名字("/myweb/image/x.gif"),
它将会验证用户,接收HTTP流的内容,并把它直接存入web服务器。由于这可能会对一个web站点造成破坏,因而
并不常用。它还会失去HTTP最大的优势:服务器可编程性。在PUT的情况下,服务器自己处理请求:没有空间
让CGI或者ASP应用程序介入。唯一让你的应用程序捕获PUT的方法是在低层操作,ISAPI过滤层。由于相应的原因,
大多数web开发者对此毫无兴趣。

HTTP上传方式3: WebDAV
WebDAV (http://www.ietf.org/html.charters/webdav-charter.html)允许web
内容的分布式认证与翻译。
它引入了几种新的HTTP动词,允许通过HTTP上传,锁定/解锁,登记/检验web内容。
将其想象成为一种非私有
的配置管理加上web文件传输。微软已经公开宣称将在IIS5、Office 2000和后续版本的IE中支持它。ISP将会
喜欢把它作为低层的、经常坏掉的FrontPage Server Extensions的替代品。注意,它并不会替代Frontpage
server extensions:它将仅仅提供低层标准的服务来支持server extensions目前执行的更为精密复杂的功能。
正是通过WebDAV,Office 2000才能做到你可能在98年10月的PDC上看到的,那些漂亮的"Save to web"功能。
听起来真不错,是吗?好了,如果你所感兴趣的一切都是上传内容,WebDAV确实棒极了。它解决了很多问题。
然而,如果你需要在在你的web应用程序里面上传文件,WebDAV对你就毫无用处可言。象HTTP PUT一样,那些
WebDAV的动词是被服务器解释的,而不是你的web应用程序。你需要工作在ISAPI过滤层来访问WebDAV的这些
动词,并在你的应用程序中解释内容。

HTTP上传机制: 结论
RFC1867仍然将大多数文件上传的灵活方法留给了你的web应用程序。PUT用得很有限。WebDAV对内容的作者很
有用,比如FrontPage用户,但是对想在web应用程序中加入文件上传的web开发者来说很少用到。

用ASP实现
我们得出结论,RFC1867是在web应用程序中加入文件上传的最好的办法。它是如何实际应用的呢?微软提供了
什么工具?还有其它哪些工具可用?

微软的Posting Acceptor
ASP不懂"multipart/form-data" 编码方案。取而代之,微软免费提供了Posting Acceptor
(http://www.microsoft.com/iis/support/iishelp/iis/htm/core/pareadme.ht
m).
Posting Acceptor是一种在上传完成后,接受REPOST到一个ASP页的ISAPI应用程
序。
(请见Scott Stanfield 98年7月的文章issue of MIND)

Software Artisans的SA-FileUp
SA-FileUp (http://www.softartisans.com/softartisans/saf.html)是最早的
商业Active Server组件
之一。97年5版本发行的版本1现在使用在全世界成千上万的站点上,包括
microsoft.com。早期的beta版为
了和ASP集成,将ISAPI过滤和Active Server组件结合在一起。随后微软发布了ASP 1.0b(ASP.DLL1.15.14.0)
,提供了几种新的方法:Request.BinaryRead。BinaryRead方法使得从浏览器到一个Active Server组件的
原始的,未处理过的数据得以利用。当这些数据能够得到利用时,SA-FileUp丢掉了ISAPI过滤的必要,并且现
在作为一个纯粹的ASP组件存在。

使用Request.BinaryRead,就如同SA-FileUp一样,和Request.Form对象是相互排斥的。 这意味着: 由于
原本的数据流是表单信息,你如何能够从浏览器中读出它的同时解析它?为了减轻ASP开发者的负担,SA-FileUp
在他自己的.Form集合中重新实现了所有Request.Form的功能。这使得那些习惯用Request.Form的程序员对
使用SA-FileUp变得熟悉。

Posting Acceptor与SA-FileUp对比
这里是PA和SA-FileUp有可能做对比的地方:

ASP 集成: SA-FileUp能完全的用ASP写脚本。而不是作为一个分离的ISAPI DLL存在,Sa-FileUp和你
的ASP应用程序结合的非常平滑。
支持标准: IE浏览器里的PA上传使用专利的WebPost API,而非标准的RFC 1867标准,因此,缺省的,
针对Netscape和IE用户,你要采用不同的表单。
匿名连接: 由于PA使用一个ISAPI DLL, 它必须在你的ASP应用程序之外提供额外的安全保障。因此,PA
缺省的是禁止所有匿名连接的。PA1.1能允许匿名上传,但是由于对上传有程序控制,所以这里存在很大
的安全隐患。而SA-FileUp与ASP集成在一起,你的应用程序能够决定安全权限级别,包括匿名。
上传控制: 传送过程中PA不允许任何上传控制。而使用SA-FileUp,你能限制上传大小,或者在执行中
随时决定取消上传。最好的地方是,你能动态改变上传的地方。
过程: PA有2步上传和重新发送过程。而通过SA-FileUp,所有事情都能一步解决,比如写入数据库依赖
于上传的状态。

上传至数据库: PA只能上传到文件。SA-FileUp能上传到文件,也能上传到数据库。
"文件名中的空格": PA处理包含空格的文件名时有个众所周知的问题,而SA-FileUp无此限制。
价格: PA随NT Option Pack捆绑, 并能从微软那里免费下载。SA-FileUp则不是免费的:它是提供支
持的商用组件。
Scott Stanfield,Vertigo软件公司的总裁
(http://www.vertigosoftware.com/ ), 98年7月Mind杂志上
Posting Acceptor一文的作者,在MIND出版后,写信给Artisans软件公司关于SA-FileUp的学习:

“对于[SA-FileUp]的学习我们非常兴奋。妙极了,非常有价值的产品 ”

普遍认同的问题
目前为止,最为普遍认同的问题是有关文件上传的安全问题。通常一个站点过于仔细的设置NTFS的安全权
限,使得匿名用户无法写入目标文件所在处。而且,即使是资深的服务器管理员也常常会误解安全性。

记住IIS/ASP在特定的安全上下文中执行每个ASP页面。如果没有验证机制,每个页面作为匿名用户执行。
web管理员能够设置对应的匿名用户的NT帐号。

对于IIS3, 缺省匿名用户是IUSR_<计算机名>.

对于IIS4,所有处理中的web应用程序的缺省匿名用户是IUSR_<计算机名>(“在分离的内存空间中运行”
没有选中)。 所有不在处理中的web应用程序的缺省匿名用户名是IWAM_<计算机名>("在分离的内存空间
中运行”被选中)。

使用SA-FileUp时,你必须确信适当的用户拥有对目标路径的读、写和删除权限。

如果强制认证,那么IIS/ASP在ASP页执行时将模仿认证过的用户。因此,认证过的用户的NT登录帐号必须
拥有对目标路径的读、写权限。

对于IIS安全性的完整讨论已经超出了本文讨论的范围。请查看IIS4的Resource Kit以得到一个好的解释。

我们来看一些代码
理论已经够了,让我们看看ASP代码看起来如何。

单个文件上传
这里是一段简单的上传单个文件的HTML表单:

<HTML> <HEAD>
<TITLE>Please Upload Your File</TITLE></HEAD>
<BODY> 
<form enctype="multipart/form-data" method="post"
action="formresp.asp">
Enter filename to upload: <input type="file" name="f1">

<input type="submit">
</form>
</BODY>
</HTML>
这里是文件 'formresp.asp'

<%@ LANGUAGE="VBSCRIPT" %>
<HTML><HEAD>
<TITLE>Upload File Results</TITLE>
</HEAD>
<BODY>
Thank you for uploading your file.

<% Set upl = Server.CreateObject("SoftArtisans.FileUp") %>
<% upl.SaveAs "C:\temp\upload.out" %><BR>
Total Bytes Written: <%=upl.TotalBytes%>
</BODY>
</HTML>
用附加表单元素上传
加入额外表单元素很简单。只要编码方式指定正确,它和普通HTML一样运做:

<HTML> <HEAD>
<TITLE>Please Upload Your File</TITLE>
</HEAD>
<BODY>
<form enctype="multipart/form-data" method="post"
action="mformresp.asp">
Enter description: <input type="text" name="descrip">

Enter filename to upload: <input type="file" name="f1">

<input type="submit">
</form>
</BODY>
</HTML>
这里是文件'mformresp.asp':

<%@ LANGUAGE="VBSCRIPT" %>
<HTML><HEAD>
<TITLE>Upload File Results</TITLE>
</HEAD>
<BODY>
Thank you for uploading your file.

<% Set upl = Server.CreateObject("SoftArtisans.FileUp") %>
<% upl.SaveAs "C:\temp\upload.out" %><BR>
Your description is: '<%=upl.Form("descrip")%>'<BR>
Total Bytes Written: <%=upl.TotalBytes%>
</BODY>
</HTML>
多个文件又如何
对于多个文件,由于浏览器不支持SIZE=属性,你必须对每个文件使用附加的<INPUT>标签:


输入第一个文件名: <input type="file" name="f1">

输入第二个文件名: <input type="file" name="f2">

表单处理相同:

<%@ LANGUAGE="VBSCRIPT" %>
<HTML><HEAD>
<TITLE>Multiple File Upload Results</TITLE>
</HEAD>
<BODY>
Thank you for uploading your files.

<% Set upl = Server.CreateObject("SoftArtisans.FileUp") %>
<% upl.Form("f1").SaveAs "C:\temp\upload1.out" %><BR>
Total Bytes Written for file 1: <%=upl.Form
("f1").TotalBytes%>
<% upl.Form("f2").SaveAs "C:\temp\upload2.out" %><BR>
Total Bytes Written for file 2: <%=upl.Form
("f2").TotalBytes%>
</BODY>
</HTML>
限制上传大小
要限制上传大小,只需仅仅设置一个属性:

<%@ LANGUAGE="VBSCRIPT" %>
<HTML><HEAD>
<TITLE>Upload File Results</TITLE>
</HEAD>
<BODY>
Thank you for uploading your file.

<% Set upl = Server.CreateObject("SoftArtisans.FileUp") %>
<% upl.MaxBytes = 1000 '--- limit the upload size to 1000
bytes %>
The maximum size that you are permitted to upload is <%
=upl.MaxBytes%> bytes per file.

<% upl.SaveAs "C:\temp\upload.out" %>
Total Bytes Written: <%=upl.TotalBytes%>

Server Filename: <%=upl.ServerName%>

Total Bytes Transmitted by you: <%=Request.TotalBytes%>
</BODY>
</HTML>
所有第1000个字节以后的内容都要被丢弃,因此web服务器的硬盘不会被不必要的填充。

结论
上传文件至你的web应用程序很简单:能够通过仅仅2行ASP代码实现。HTTP/RFC1867上传是推荐
的机制,因为服务器提供了丰富的编程环境。SA-FileUp作为ASP集成的Active
Server组件,比
起微软免费的Posting Acceptor,能提供更多的便利。

参考
SA-FileUp: http://www.softartisans.com/softartisans/saf.html

Posting Acceptor Newsgroup:
news://msnews.microsoft.com/microsoft.public.site-
server.postingacceptr

RFC1867:http://info.internet.isi.edu/in-notes/rfc/files/rfc1867.txt

WebDAV:http://www.ietf.org/html.charters/webdav-charter.html

David Wihl是Artisans软件公司的总裁。(http://www.softartisans.com/)公司地处
Brookline,MA,是一个迅速发展的高性能Active Server组件提供商。他是SA-
FileUp最
初的作者,并且仍然埋头工作于即将到来的激动人心的增强功能之中。可以这样联系他
wihl@softartisans.com



我喜欢千万法,我用压码和右脑给千万别学英语一个杠杆,撬起零基础到达自由王国;压码只有一个指标:通过滞后提高速度,速度就是质量,给它注入一个加速器,就会产生一个个奇迹.
[4 楼] | Posted:2005-04-17 06:06|
级别: 总版主
只看该作者 3 发表于: 2005-11-28
[ASP]利用 xmlhttp 分块上传文件
http://www.blueidea.com/tech/program/2004/1947.asp

[ASP]利用 xmlhttp 分块上传文件
作者:tzboy 时间: 2004-06-10 文档类型:原创 来自:蓝色理想
浏览统计 total:11108 | Week:6 | today:6




编写思路:把本地文件在客户端通过base64编码以后发送目的地.
测试过程中,上传文件过大,导致超时不成功.
后来经过改善.把编码分段发送.测试20M成功

编写目的:在传统的解决方案里面,一次一次选取上传可以.但是在碰到把数据库里文件路径读出来,并把这些文件上传到一个地方的时候就比较麻烦.
如果得到路径一个一个去找到用ftp当然也是可以的,但每次找这些文件我看都会比较费时。这里编写这个主要就是为了通过数据库里的文件路径取得文件.把文件一次批量上传到一个地方.
其主要目的还是为了锻炼一下自己.

解决过程:起初试着用模拟键盘输入强行赋值给file控件用传统的方法上传。可是老碰到空值的情况,以至有很多文件没有发送出去。查阅一些资料,现在是把所有路径通过数据库取到然后写到一个js里。然后在前台用js读取这些路径,通过xmlhttp来发送文件。
因为ie不太喜欢xmlHttp.总认为他有恶意行为.所以老谈出提示警告.所以操作的时候不能使用web路径.只能用物理路径去访问它.
然后服务端有一文件来接收这些编码,并对其进行解码.所以我称之为"c/s". ^_^

目前很多代码还在完善中.
简单介绍一下:

aryFiles.push("c:\\aaa.zip") ;
aryFiles.push("c:\\bbb.exe") ;
这里为文件路径和文件.可为多个
以后这个路径也可以通过file控件在客户端取到

http:// www.xxx.com/xxx/xxx.asp
这个是目的地,可以改为自己想要的地址.

ado_stream.LoadFromFile(server.mappath(".") &"/"& + str_filename)
server.mappath(".") &"/"& + str_filename 这里是读取文件.
server.mappath(".") &"/"& 路径和存放路径一致

ado_stream.SaveToFile server.mappath(".") &"/"& str_filename,2
server.mappath(".") &"/"& 这个为存放文件的路径. str_filename 为文件名

这里读取和存放都是放在程序所放目录中.大家测试的时候也可以保持这样即可

把第一段代码放到本地(eg:c:\upload.htm)

把第二段代码放到服务器上,可以是本地服务器,可以是公网服务器.和上面的目的地保持一致
(eg:http://www.xxx.com/upload.asp or http:// localhost/www/upload.asp)


操作:找到第一段代码保存的地方。执行即可(eg:打开c盘执行upload.htm)

目前程序还在调试过程中,希望大家提出宝贵意见

客户端代码<html>
<head>
</head>
<body> <input type=button onclick="BeginSendFiles();"
value="发送" /> <input type=button onclick="JavaScript:
Breaked=true;" value="中断" /> <div id="ddd"
width=300px></div> <br></br> <DIV
id=div_message></DIV>
</body>
<script language=VBScript> Function bytes2BSTR(vIn) strReturn =
"" For i = 1 To LenB(vIn) ThisCharCode = AscB(MidB(vIn,i,1)) If
ThisCharCode < &H80 Then strReturn = strReturn &
Chr(ThisCharCode) Else NextCharCode = AscB(MidB(vIn,i+1,1)) strReturn =
strReturn & Chr(CLng(ThisCharCode) * &H100 +
CInt(NextCharCode)) i = i + 1 End If Next bytes2BSTR = strReturn End
Function
</script>
<script language=javascript> var xmlhttp ; var ado_stream ; var
mFileName, mPartStart, mPartID, mPartEnd ; var SendCount ; var
BlockSize ; var Breaked ; var aryFiles ; BlockSize = 1024*100
;//每次发送字节数 Breaked = false ; aryFiles = new Array() ; // 开始发送文件
function BeginSendFiles() { initAryFiles() ; SendFile(aryFiles.pop()) ;
} // 构造待发送文件的数组 function initAryFiles() { aryFiles.push("c:\\aaa.zip")
; aryFiles.push("c:\\bbb.exe") ; //c:\\aaa.zip c:\\bbb.exe本地文件
aryFiles.reverse() ;//文件名 } function SendFile(vFullPath) { // 空文件则不执行上传
if (!vFullPath) { return ; } Breaked = false ; div_message.innerHTML =
"" ; ado_stream = new ActiveXObject("ADODB.Stream"); // 读取文件的流
ado_stream.Type = 1; ado_stream.Open();
ado_stream.LoadFromFile(vFullPath); // 读取文件 ado_stream.position = 0 ;
SendCount = Math.ceil(ado_stream.size/BlockSize) ; // 如果有余数则多发送一次 //
alert(SendCount) ; var reg = /\b\w+.\w+$/gi mFileName =
reg.exec(vFullPath) ; mPartStart = true ; mPartID = 1 ; mPartEnd =
false ; SendData() ; } function SendData() { if (SendCount > 0) {
var dom = new ActiveXObject("msxml2.DOMDocument"); // 发送的xml文件
dom.async = false; dom.resolveExternals = false; // 构造xml文件头 var node =
dom.createProcessingInstruction("xml","version='1.0'");
dom.appendChild(node) ; node = null ; // 构造root节点 var root =
dom.createElement("root"); dom.appendChild(root) ;
dom.documentElement.setAttribute("xmlns:dt",
"urn:schemas-microsoft-com:datatypes"); // 构造保存二进制数据的节点updata node =
dom.createElement("upData") ; node.dataType = "bin.base64" ; //
bin。base64编码 var att = dom.createAttribute("FileName") ; // 文件名属性
att.value = mFileName ; node.setAttributeNode(att) ; att = null ; var
att = dom.createAttribute("PartStart") ; // 分段开始标记 att.value =
mPartStart ; node.setAttributeNode(att) ; att = null ; var att =
dom.createAttribute("PartID") ; // 分段序号 att.value = mPartID ;
node.setAttributeNode(att) ; att = null ; var att =
dom.createAttribute("PartEnd") ; // 分段结束标记 att.value = mPartEnd ;
node.setAttributeNode(att) ; att = null ; root.appendChild(node) ;
node.nodeTypedValue = ado_stream.Read(BlockSize); // 节点数据从stream读取,固定长度
node = null ; SendCount -= 1 ; xmlhttp = new
ActiveXObject("Microsoft.XMLHTTP");
xmlhttp.open("POST","http://www.xxx.com/xxx/xxx.asp", false);
//http://www.xxx.com/xxx/xxx.asp 为web路径上的文件 xmlhttp.onreadystatechange=
CallBack ; xmlhttp.send(dom); mPartStart = false ; xmlhttp = null ; }
else { ado_stream.Close(); ado_stream = null ; } } function CallBack()
{ // 上传成功 if(xmlhttp.readystate == 4) { // 检查是否中断上传 if(Breaked) {
return ; } if (SendCount > 0) { mPartID += 1 ; //
div_message.innerHTML += ("<br>" + xmlhttp.ResponseText) ; var p
= Math.floor((mPartID/(Math.ceil(ado_stream.size/BlockSize) + 1)) *
100) ; // 计算进度百分比 ShowBar(p) ; var t = setTimeout("SendData();", 1) ; }
else { // 传送完文件 //div_message.innerHTML += mFileName +
"传送完毕!<br>" ; // 继续传下一文件 ShowBar(0) ; var cFile = aryFiles.pop()
; SendFile(cFile) ; } } } function ShowBar(per) { // 进度条 ddd.innerHTML
= "<table width='200' border=0 cellpadding='0' cellspacing='0'
><tr><td bgcolor='#6699FF'><input type=button style='
width:" + per + "% ; border:0px; background:#005599; color:#FFFFFF'
value=" + per + "%> </td></tr></table>" ; }
</script>
</html> [Ctrl+A 全部选择 提示:你可先修改部分代码,再按运行]


服务端代码<%@ LANGUAGE=VBScript%>
<% Option Explicit
Response.Expires = 0

' 定义变量和对象。
dim ado_stream
dim xml_dom
dim xml_data
dim str_filename
dim bol_PartStart
dim int_PartID
dim bol_PartEnd

' 创建 Stream 对象
set ado_stream = Server.CreateObject("ADODB.Stream")
' 从Request对象创建 XMLDOM对象
set xml_dom = Server.CreateObject("MSXML2.DOMDocument")
xml_dom.load(request)
' 读出包含二进制数据的节点
set xml_data = xml_dom.selectSingleNode("root/upData")
str_filename = xml_data.getAttribute("FileName")
bol_PartStart = CBool(xml_data.getAttribute("PartStart"))
int_PartID = CInt(xml_data.getAttribute("PartID"))
bol_PartEnd = CBool(xml_data.getAttribute("PartEnd"))

' 打开Stream对象,把数据存入其中
ado_stream.Type = 1 ' 1=adTypeBinary
ado_stream.open
if not bol_PartStart then
ado_stream.LoadFromFile(server.mappath(".") &"/"& + str_filename)   ' 读取文件
ado_stream.position = ado_stream.size
end if
ado_stream.Write xml_data.nodeTypedValue
' 文件存盘
ado_stream.SaveToFile server.mappath(".") &"/"& str_filename,2
'保存文件 2=adSaveCreateOverWrite
ado_stream.close

' 释放资源
set ado_stream = Nothing
set xml_dom = Nothing
' 向浏览器返回信息
Response.Write "Upload successful!"& str_filename & int_PartID & bol_PartStart
%>
[Ctrl+A 全部选择 提示:你可先修改部分代码,再按运行]

另外:此文的目的并不是说这个程序能给朋友们解决什么问题,主要目的还是为了和大家交流一些心得:
碰到问题->发现问题->解决问题.
希望大家都不要成为一个标准的代码机器人。
多学、多看、多思考、多实践。
没有什么是不能解决的。

如对此文有意见,欢迎到这里进行讨论。

出处:蓝色理想



我喜欢千万法,我用压码和右脑给千万别学英语一个杠杆,撬起零基础到达自由王国;压码只有一个指标:通过滞后提高速度,速度就是质量,给它注入一个加速器,就会产生一个个奇迹.
[5 楼] | Posted:2005-04-17 09:13|
级别: 总版主
只看该作者 4 发表于: 2005-11-28
http://www.blueidea.com/tech/program/2004/1947.asp

[ASP]利用 xmlhttp 分块上传文件
作者:tzboy 时间: 2004-06-10 文档类型:原创 来自:蓝色理想
浏览统计 total:11108 | Week:6 | today:6




编写思路:把本地文件在客户端通过base64编码以后发送目的地.
测试过程中,上传文件过大,导致超时不成功.
后来经过改善.把编码分段发送.测试20M成功

编写目的:在传统的解决方案里面,一次一次选取上传可以.但是在碰到把数据库里文件路径读出来,并把这些文件上传到一个地方的时候就比较麻烦.
如果得到路径一个一个去找到用ftp当然也是可以的,但每次找这些文件我看都会比较费时。这里编写这个主要就是为了通过数据库里的文件路径取得文件.把文件一次批量上传到一个地方.
其主要目的还是为了锻炼一下自己.

解决过程:起初试着用模拟键盘输入强行赋值给file控件用传统的方法上传。可是老碰到空值的情况,以至有很多文件没有发送出去。查阅一些资料,现在是把所有路径通过数据库取到然后写到一个js里。然后在前台用js读取这些路径,通过xmlhttp来发送文件。
因为ie不太喜欢xmlHttp.总认为他有恶意行为.所以老谈出提示警告.所以操作的时候不能使用web路径.只能用物理路径去访问它.
然后服务端有一文件来接收这些编码,并对其进行解码.所以我称之为"c/s". ^_^

目前很多代码还在完善中.
简单介绍一下:

aryFiles.push("c:\\aaa.zip") ;
aryFiles.push("c:\\bbb.exe") ;
这里为文件路径和文件.可为多个
以后这个路径也可以通过file控件在客户端取到

http:// www.xxx.com/xxx/xxx.asp
这个是目的地,可以改为自己想要的地址.

ado_stream.LoadFromFile(server.mappath(".") &"/"& + str_filename)
server.mappath(".") &"/"& + str_filename 这里是读取文件.
server.mappath(".") &"/"& 路径和存放路径一致

ado_stream.SaveToFile server.mappath(".") &"/"& str_filename,2
server.mappath(".") &"/"& 这个为存放文件的路径. str_filename 为文件名

这里读取和存放都是放在程序所放目录中.大家测试的时候也可以保持这样即可

把第一段代码放到本地(eg:c:\upload.htm)

把第二段代码放到服务器上,可以是本地服务器,可以是公网服务器.和上面的目的地保持一致
(eg:http://www.xxx.com/upload.asp or http:// localhost/www/upload.asp)


操作:找到第一段代码保存的地方。执行即可(eg:打开c盘执行upload.htm)

目前程序还在调试过程中,希望大家提出宝贵意见

客户端代码<html>
<head>
</head>
<body> <input type=button onclick="BeginSendFiles();"
value="发送" /> <input type=button onclick="JavaScript:
Breaked=true;" value="中断" /> <div id="ddd"
width=300px></div> <br></br> <DIV
id=div_message></DIV>
</body>
<script language=VBScript> Function bytes2BSTR(vIn) strReturn =
"" For i = 1 To LenB(vIn) ThisCharCode = AscB(MidB(vIn,i,1)) If
ThisCharCode < &H80 Then strReturn = strReturn &
Chr(ThisCharCode) Else NextCharCode = AscB(MidB(vIn,i+1,1)) strReturn =
strReturn & Chr(CLng(ThisCharCode) * &H100 +
CInt(NextCharCode)) i = i + 1 End If Next bytes2BSTR = strReturn End
Function
</script>
<script language=javascript> var xmlhttp ; var ado_stream ; var
mFileName, mPartStart, mPartID, mPartEnd ; var SendCount ; var
BlockSize ; var Breaked ; var aryFiles ; BlockSize = 1024*100
;//每次发送字节数 Breaked = false ; aryFiles = new Array() ; // 开始发送文件
function BeginSendFiles() { initAryFiles() ; SendFile(aryFiles.pop()) ;
} // 构造待发送文件的数组 function initAryFiles() { aryFiles.push("c:\\aaa.zip")
; aryFiles.push("c:\\bbb.exe") ; //c:\\aaa.zip c:\\bbb.exe本地文件
aryFiles.reverse() ;//文件名 } function SendFile(vFullPath) { // 空文件则不执行上传
if (!vFullPath) { return ; } Breaked = false ; div_message.innerHTML =
"" ; ado_stream = new ActiveXObject("ADODB.Stream"); // 读取文件的流
ado_stream.Type = 1; ado_stream.Open();
ado_stream.LoadFromFile(vFullPath); // 读取文件 ado_stream.position = 0 ;
SendCount = Math.ceil(ado_stream.size/BlockSize) ; // 如果有余数则多发送一次 //
alert(SendCount) ; var reg = /\b\w+.\w+$/gi mFileName =
reg.exec(vFullPath) ; mPartStart = true ; mPartID = 1 ; mPartEnd =
false ; SendData() ; } function SendData() { if (SendCount > 0) {
var dom = new ActiveXObject("msxml2.DOMDocument"); // 发送的xml文件
dom.async = false; dom.resolveExternals = false; // 构造xml文件头 var node =
dom.createProcessingInstruction("xml","version='1.0'");
dom.appendChild(node) ; node = null ; // 构造root节点 var root =
dom.createElement("root"); dom.appendChild(root) ;
dom.documentElement.setAttribute("xmlns:dt",
"urn:schemas-microsoft-com:datatypes"); // 构造保存二进制数据的节点updata node =
dom.createElement("upData") ; node.dataType = "bin.base64" ; //
bin。base64编码 var att = dom.createAttribute("FileName") ; // 文件名属性
att.value = mFileName ; node.setAttributeNode(att) ; att = null ; var
att = dom.createAttribute("PartStart") ; // 分段开始标记 att.value =
mPartStart ; node.setAttributeNode(att) ; att = null ; var att =
dom.createAttribute("PartID") ; // 分段序号 att.value = mPartID ;
node.setAttributeNode(att) ; att = null ; var att =
dom.createAttribute("PartEnd") ; // 分段结束标记 att.value = mPartEnd ;
node.setAttributeNode(att) ; att = null ; root.appendChild(node) ;
node.nodeTypedValue = ado_stream.Read(BlockSize); // 节点数据从stream读取,固定长度
node = null ; SendCount -= 1 ; xmlhttp = new
ActiveXObject("Microsoft.XMLHTTP");
xmlhttp.open("POST","http://www.xxx.com/xxx/xxx.asp", false);
//http://www.xxx.com/xxx/xxx.asp 为web路径上的文件 xmlhttp.onreadystatechange=
CallBack ; xmlhttp.send(dom); mPartStart = false ; xmlhttp = null ; }
else { ado_stream.Close(); ado_stream = null ; } } function CallBack()
{ // 上传成功 if(xmlhttp.readystate == 4) { // 检查是否中断上传 if(Breaked) {
return ; } if (SendCount > 0) { mPartID += 1 ; //
div_message.innerHTML += ("<br>" + xmlhttp.ResponseText) ; var p
= Math.floor((mPartID/(Math.ceil(ado_stream.size/BlockSize) + 1)) *
100) ; // 计算进度百分比 ShowBar(p) ; var t = setTimeout("SendData();", 1) ; }
else { // 传送完文件 //div_message.innerHTML += mFileName +
"传送完毕!<br>" ; // 继续传下一文件 ShowBar(0) ; var cFile = aryFiles.pop()
; SendFile(cFile) ; } } } function ShowBar(per) { // 进度条 ddd.innerHTML
= "<table width='200' border=0 cellpadding='0' cellspacing='0'
><tr><td bgcolor='#6699FF'><input type=button style='
width:" + per + "% ; border:0px; background:#005599; color:#FFFFFF'
value=" + per + "%> </td></tr></table>" ; }
</script>
</html> [Ctrl+A 全部选择 提示:你可先修改部分代码,再按运行]


服务端代码<%@ LANGUAGE=VBScript%>
<% Option Explicit
Response.Expires = 0

' 定义变量和对象。
dim ado_stream
dim xml_dom
dim xml_data
dim str_filename
dim bol_PartStart
dim int_PartID
dim bol_PartEnd

' 创建 Stream 对象
set ado_stream = Server.CreateObject("ADODB.Stream")
' 从Request对象创建 XMLDOM对象
set xml_dom = Server.CreateObject("MSXML2.DOMDocument")
xml_dom.load(request)
' 读出包含二进制数据的节点
set xml_data = xml_dom.selectSingleNode("root/upData")
str_filename = xml_data.getAttribute("FileName")
bol_PartStart = CBool(xml_data.getAttribute("PartStart"))
int_PartID = CInt(xml_data.getAttribute("PartID"))
bol_PartEnd = CBool(xml_data.getAttribute("PartEnd"))

' 打开Stream对象,把数据存入其中
ado_stream.Type = 1 ' 1=adTypeBinary
ado_stream.open
if not bol_PartStart then
ado_stream.LoadFromFile(server.mappath(".") &"/"& + str_filename)   ' 读取文件
ado_stream.position = ado_stream.size
end if
ado_stream.Write xml_data.nodeTypedValue
' 文件存盘
ado_stream.SaveToFile server.mappath(".") &"/"& str_filename,2
'保存文件 2=adSaveCreateOverWrite
ado_stream.close

' 释放资源
set ado_stream = Nothing
set xml_dom = Nothing
' 向浏览器返回信息
Response.Write "Upload successful!"& str_filename & int_PartID & bol_PartStart
%>
[Ctrl+A 全部选择 提示:你可先修改部分代码,再按运行]

另外:此文的目的并不是说这个程序能给朋友们解决什么问题,主要目的还是为了和大家交流一些心得:
碰到问题->发现问题->解决问题.
希望大家都不要成为一个标准的代码机器人。
多学、多看、多思考、多实践。
没有什么是不能解决的。

如对此文有意见,欢迎到这里进行讨论。

出处:蓝色理想



我喜欢千万法,我用压码和右脑给千万别学英语一个杠杆,撬起零基础到达自由王国;压码只有一个指标:通过滞后提高速度,速度就是质量,给它注入一个加速器,就会产生一个个奇迹.
[5 楼] | Posted:2005-04-17 09:13|
级别: 总版主
只看该作者 5 发表于: 2005-11-28
http://disk.qq.com/func/function3.htm

演示:  

http://disk.qq.com/demo.htm

首页新闻邮箱会员相册游戏中心交友贺卡QQ秀QQ软件杂志聊天论坛


请输入手机号码:  
要获赠的QQ号码:  
重复输入QQ号码:  


开通服务 升级服务 上传文件 下载文件 移动文件
删除文件 上传文件夹 下载文件夹 新建文件夹 移动文件夹
删除文件夹 续传文件 续传文件夹 查看属性 显示方式变换
右键菜单上传 文件夹共享 音频在线播放 文件邮件转发 刷新
《腾讯共享》 网络硬盘升级 网络硬盘加密 QQ表情上传 文件下载路径
好友共享删除 Disk专用QQ秀 网络记事本  

开通服务


1.QQ免费普通用户
只需要点击QQ2004Beta版的最后一个面板图标,确认QQ免费用户使用协议,就可以享受16M免费网络硬盘空间;

2.QQ行用户
只需要点击QQ2004Beta版的最后一个面板图标,就可以享受32M网络硬盘空间;

3.QQ会员用户
只需要点击QQ2004Beta版的最后一个面板图标,就可以享受128M网络硬盘空间。






上传文件


1.拖拉上传
在Windows界面选中需要上传的文件,按住鼠标左键,拖动文件,至QQ网络硬盘面板的任何文件夹,松开鼠标,系统将自动完成上传;



2.工具栏图标
在QQ网络硬盘面板,最上端的工具栏提供了上传,用户点击该图标,在弹出的对话框选择要上传的文件,确认后,系统将自动完成上传;


3.键盘快捷键
在Windows界面选中需要上传的文件,按CTRL+C键,到QQ网络硬盘面板,选中需要存储的文件夹,按CTRL+V键,系统将自动完成上传;

4.鼠标右键菜单
在QQ网络硬盘面板,选中文件夹,点击鼠标右键,选择"上传",在弹出的对话框选择要上传的文件,确认后,系统将自动完成上传。





网络硬盘是腾讯公司推出的在线存储服务。服务面向所有QQ用户,提供文件的存储、访问、共享、备份等功能。


下载文件


1.拖拉下载
在QQ网络硬盘界面选中需要下载的文件,按住鼠标左键,拖动文件,至Windows界面的任何文件夹,松开鼠标,系统将自动完成下载;

2.工具栏图标
在QQ网络硬盘面板,最上端的工具栏提供了下载,用户点击该图标,在弹出的对话框选择要下载至文件夹,确认后,系统将自动完成下载;



3.键盘快捷键
在QQ网络硬盘界面选中需要下载的文件,按CTRL+C键,到Windows界面,选中需要存储的文件夹,按CTRL+V键,系统将自动完成下载;

4.鼠标右键菜单
在QQ网络硬盘面板,选中文件夹,点击鼠标右键,选择"下载",在弹出的对话框选择要下载到的文件夹,确认后,系统将自动完成下载。




上传文件夹


1.拖拉上传
在Windows界面选中需要上传的文件夹,按住鼠标左键,拖动文件夹,至QQ网络硬盘面板的任何文件夹,松开鼠标,系统将自动完成上传;


2.键盘快捷键
在Windows界面选中需要上传的文件夹,按CTRL+C键,到QQ网络硬盘面板,选中需要存储的文件夹,按CTRL+V键,系统将自动完成上传。



文件夹共享


在QQ网络硬盘界面,右键任意点击任何文件夹,在弹出的右键菜单里,选择"设置共享",在接下来弹出的对话框选择想要共享的好友,确认后,即可完成文件夹的共享。







关于腾讯 | About Tencent | 服务条款 | 广告服务 | 腾讯招聘 | 客服中心 | 网站导航

Copyright © 1998 - 2005 TENCENT Inc. All Rights Reserved
腾讯公司 版权所有



我喜欢千万法,我用压码和右脑给千万别学英语一个杠杆,撬起零基础到达自由王国;压码只有一个指标:通过滞后提高速度,速度就是质量,给它注入一个加速器,就会产生一个个奇迹.
[6 楼] | Posted:2005-04-17 09:49|
级别: 总版主
只看该作者 6 发表于: 2005-11-28
级别: 总版主
只看该作者 7 发表于: 2005-11-28
http://tech.sina.com.cn/c/4084.html

通过网页实现文件上传

--------------------------------------------------------------------------------

http://www.sina.com.cn/ 2001/06/28 14:55 赛迪网 蒋晓京

  我们建设web网站经常会遇到的一个问题就是:如何实现通过浏览器上传文件到web服务器。通常从浏览者那里获取文件的方法,如通过ftp、email方式等,都比较繁琐,特别是对于网站管理者来说,这些方式都需要一定程度的人工干预,否则就不能把结果实时地显示在网页上。microsoft posting acceptor(简称mpa)是微软公司发布的一个免费服务器组件,使用它可以容易地实现浏览器通过调用网页向服务器端上传文件,如果再编写相应的asp代码,就能使上传结果自动显示在网页上,从而实现诸如美术、摄影作品的征集展示,软件、程
序的动态发布以及通过网页发邮件中的附件上载等功能。你甚至可以为用户提供宿主服务,让他们在你的服务器上发布自己的主页,就像现在因特网上提供的免费个人主页空间那样。开发者只须编写一次asp代码,以后的所有工作都将自动进行。

  安装运行mpa

  1.环境:要安装mpa,首先应确保你的web服务器满足运行asp程序的条件。这方面的文章很多,这里就不重复了。例如可配置为:windowsnt4.0+optionpack4。

  2.软件:可在以下网址下载mpa:

  http://www.microsoft.com/msdownload/postacc.htm,应该是一个2mb多的exe文件。

  3.安装:在web服务器上运行下载的文件,运行后在web发布目录的上级目录(一般是c:inetpubscript目录)中找到cpshost.dll文件,表明mpa已安装。安装后还生成一些技术文档,有html格式的,也有pdf格式的,里面有对mpa很详细的说明。

  4.设置:把cpshost.dll文件所在目录设为web发布虚拟目录,并把访问权限设为“可执行”,把url“http://(服务器网址)/users”对应的目录权限设为上传者可“写入”。

  5.运行:在浏览器中调用该目录下的upload.asp页,即可实现通过网页的文件上传。

  使用mpa的几点体会

  编辑推荐阅读

  ●用ASP编写计数器

  ●专题:网站整体设计技巧

  1.浏览器支持:mpa支持多种浏览器,cpshost.dll文件所在目录中的upload.asp页实际上是个浏览器类型判断页,它根据服务器端的browser.ini文件提供的参数判断浏览器类型并转到相应页:uploadx.asp(支持activex的浏览器:如ie4以上)或uploadn.asp(不支持activex的浏览器),uploadn.asp也可用于支持activex的浏览器。

  2.上传目录:web管理者或用户可根据需要在uploadn.asp或uploadx.asp页中指定上传文件的目标目录,此目标目录可与web服务器在不同的物理服务器上,但上传者对此目录一定要有“写入”的权限。缺省状态下,用mpa上传文件时会问用户名和口令,上传的文件会放到“http://(服务器网址)/users/(nt域名)/(用户名)”对应的目录下。子目录“(nt域名)/(用户名)”是自动创建的。另外,最好不要给上传目录的虚拟web目录以“可执行”的权限。


图1 uploadn.asp页

  3.上传文件个数:一次可上传多个文件。如果经常要大批量上传文件,用uploadx.asp页会比较方便―――只选一次即可,而用uploadn.asp则每个文件都要选一次。


图2 uploadx.asp页

  4.附加信息:直接调用uploadn.asp,可在此页的表单中增加字段来附加文字资料,在repost.asp页中接收这些信息。上传文件的文件名、大小、存放路径等信息也可在此页中自动取得,聪明的读者一定会想到,要把上传文件的相关信息存入数据库,在此页添加代码即可。

  存在的问题及解决办法

  1.文件改名:直接用mpa上传的文件,只能以原文件名保存到目标目录,当上传文件与目标目录中已有文件重名时,只能简单覆盖。虽然不同用户间由于用户名不同,所以目标目录不同,不会覆盖,但不能保证同一用户自己不覆盖自己的。在iis4中这个问题可以通过filesystemobject(文件系统对象)解决:先把文件上传到一临时目录中,取得文件名,调用filesystemobject来判断目标目录中有无重名文件,再根据情况用filesystemobject实现文件的改名、复制、删除等操作。

  2.对上传加以限制:据微软公司自己称,当上传特大文件时,会使服务器的cpu百分之百被占用,从而停止响应。虽然我们一般不会遇到这种问题,但对上传加以限制,防患于未然还是很有必要的。在注册表的hklmsoftwaremicrosoftwebpostcceptorsshost下有两个键值:

  maximumopentransactions(最大并发事务的个数,缺省值200个)

  opentransactionstimeout(事务处理时间溢出,缺省值600秒)

  可修改其值对上传加以限制。

  3.对附加信息的限制:虽然通过修改uploadn.asp和repost.asp页使我们在文件上传的同时可以附加一些信息,但包括file、targeturl等表单字段在内,所有同上传文件一起发送的表单字段都受如下限制:每个字段不能超过255字节;字段中不能包含半角逗号,否则其后的内容会丢失;字段中不能包含半角空格,半角空格在上传后会丢失。如果一定要传半角逗号和半角空格,可用其它不常用的符号代替,上传后再用replace替换过来,也可让文件和文字分开传。

  4.session的保存:上传过程会使asp的session对象中的数据全部丢失。要保存session中的数据,可在uploadn.asp页的表单中添加一隐藏的表单字段来存放session中的数据。

  5.实现匿名上传:可能是出于安全方面的考虑,缺省状态下,mpa不支持匿名上传,即使删掉asp页头几行的口令验证代码也没用。但我们可通过修改注册表达到这一目的:

  去掉asp页中验证用户名的代码;

  运行regedit.exe(95/98)或regedt32.exe(nt);

  找到hkey_local_machinesoftwaremicrosoftwebpostcceptorsshost;

  增加键值:名称:allowanonymous,类型:reg_dword,值:1;

  重启服务器。

  但这一方法对6.0.86.0版的cpshost.dll无效。(责任编辑Ray)




【发表评论】【初学者园地】【科技聊天】【关闭窗口】


新 闻 查 询

综合 网站 中文网页 新闻标题 新闻全文 汉英辞典 沪深行情 软件 游戏  



 相关链接
ASP与数据库运用:密码验证 (2000/10/30 17:49)
三种Web开发主流技术ASP/PHP/JSP评述 (2000/10/20 15:46)



我喜欢千万法,我用压码和右脑给千万别学英语一个杠杆,撬起零基础到达自由王国;压码只有一个指标:通过滞后提高速度,速度就是质量,给它注入一个加速器,就会产生一个个奇迹.
[8 楼] | Posted:2005-04-17 10:45|
--------------------------------------------------------------------------------

关于Win2K3中利用ASP上传文件的问题!
CSDN - 文档中心 - ASP 阅读:614   评论: 0   参与评论

标题   关于Win2K3中利用ASP上传文件的问题!   选择自 dddggg 的 Blog
关键字   关于Win2K3中利用ASP上传文件的问题!
出处  




一般情况下,在Win2k3中用ASP上传文件是不会直接成功的,因为系统中作了一项限制,可能通过手工修改一下其设置,方法如下:
在服务里关闭iis admin service服务
找到windows\system32\inesrv\下的metabase.xml,
打开,找到ASPMaxRequestEntityAllowed 把他修改为需要的值,默认为204800,即200K
然后重启iis admin service服务



我喜欢千万法,我用压码和右脑给千万别学英语一个杠杆,撬起零基础到达自由王国;压码只有一个指标:通过滞后提高速度,速度就是质量,给它注入一个加速器,就会产生一个个奇迹.
[9 楼] | Posted:2005-04-17 10:52|
级别: 总版主
只看该作者 8 发表于: 2005-11-28
ASP上传数据流格式分析
ASP上传数据流格式分析

ASP上传数据流格式分析
2001年12月2日


本站原创:lzc

最近经常见到有人被使用ASP上传文件所困扰,而所遇到的问题主要就是对于通过表格提交的流数据的分析,为了减轻各位ASP爱好者的工作同时详尽的分析这种流数据的格式就产生了本文。由于本文中所介绍的都是lzc自己分析上传数据所得的结果,所以有可能不甚准确,请谅解并欢迎帮助查找错误。

要通过HTTP上传文件首先要在提交的form的定义中加入ENCTYPE="multipart/form-data"类型标示,然后使用<input type="file"...>标识,用户就可以在浏览时使用该input框选取要上传的文件。

这样在form提交后将自动把文件数据一同上传到Server端,此时必须使用request对象的binaryread方法取数据才能读文件数据并进行相应操作,如果使用response对象的binarywrite方法将数据显示在页面上你就会看到事实上所有的文件数据和form表格内部数据全都混杂在一起,而调用页面的"?"后面的参数也全部丢失了。

下面附一个完整的数据上传结果,我们将在此基础上对所上传的数据进行分析。上传的数据中有2个文本输入框,分别名称"text"和"FileNumber"(FileNumber表示上传的文件数),一个checkbox,名称"check",两个文件上传,名称"File"和"File1"(该名称由上传页脚本自动计算生成),以及一个"submit"按钮,名称"Submit",值为"确定"。为了使数据比较清晰我选择了两个文本文件进行上传,如果上传二进制文件其效果是一样的。具体上传数据如下:

-----------------------------7d18e2d3f01e0
Content-Disposition: form-data; name="check"

on
-----------------------------7d18e2d3f01e0
Content-Disposition: form-data; name="FileNumber"

2
-----------------------------7d18e2d3f01e0
Content-Disposition: form-data; name="File0"; filename="D:\Starcraft\sc.reg"
Content-Type: application/octet-stream

REGEDIT4

[HKEY_CURRENT_USER\Software\Battle.net\Configuration]
"Battle.net gateways"=hex(7):31,30,30,30,00,30,31,00,31,39,32,2e,31,36,38,2e,\
31,30,32,2e,38,36,00,2d,39,00,42,50,55,20,35,23,20,53,65,72,76,65,72,00,75,\
73,77,65,73,74,2e,62,61,74,74,6c,65,2e,6e,65,74,00,38,00,55,2e,53,2e,20,57,\
65,73,74,00,75,73,65,61,73,74,2e,62,61,74,74,6c,65,2e,6e,65,74,00,36,00,55,\
2e,53,2e,20,45,61,73,74,00,61,73,69,61,2e,62,61,74,74,6c,65,2e,6e,65,74,00,\
2d,39,00,41,73,69,61,00,65,75,72,6f,70,65,2e,62,61,74,74,6c,65,2e,6e,65,74,\
00,2d,31,00,45,75,72,6f,70,65,00,00

[HKEY_LOCAL_MACHINE\SOFTWARE\Battle.Net\Configuration]
"Server List"="192.168.102.86"
"Server Version"=dword:00000001

-----------------------------7d18e2d3f01e0
Content-Disposition: form-data; name="File1"; filename="C:\cheaters.log"
Content-Type: application/octet-stream

Windows renabled
Windows renabled
Windows renabled
Windows renabled
Windows renabled

-----------------------------7d18e2d3f01e0
Content-Disposition: form-data; name="text"

asdf
-----------------------------7d18e2d3f01e0
Content-Disposition: form-data; name="submit"

确定
-----------------------------7d18e2d3f01e0--

这只是一个小例子,从中我们可以简单的分析一下ASP的流式上传数据格式,如下(对于类似的数据段,我只挑其中一个介绍):

1."-----------------------------7d12a925602d2"
这是用来唯一标识一次上传的编码,该数字自动生成并且保证任意两次上传绝对不会有相同的标识,同时也是用来分隔各输入框数据的分隔符,在数据传输的最后由该字符串后跟"--"标识。在上面的例子中该字串被标为红色粗体,以便于区分各个数据段。

2."Content-Disposition: form-data;"
用来表示该数据段为form提交的数据。

3.name="check"
数据框的名称,大家平时都是使用request.form("check")读取这个CheckBox的内容。

4."on"
CheckBox数据框的内容,也就是request.form("check")的返回值,CheckBox类型输入框(复选框)被选中时提交"on",未被选中时不提交数据(即上传结果中根本不出现)。

5.filename="D:\Starcraft\sc.reg"
上面所说的type="file"的input框会把文件在客户端的路径传到服务器,使用的就是这个字段,这一句表示上传的文件为D盘Starcraft目录下的sc.reg(星际争霸的注册文件)。

6.Content-Type: application/octet-stream
说明是文件上传,同时说明为流式上传。

7.文件数据
文件数据是以两个VbCrLf(硬回车)表示开始的,文件数据结束后也是两个VbCrLf。例子中用蓝色标出。

除"file"外所有的输入方式上传后结果都是一样的,如下:
-----------------------------7d139414602d2
Content-Disposition: form-data; name="text"
(此处为空行)
asdf
表示由form提交的名称为text的输入框,其值为asdf。

ASP不能轻松的上传文件主要原因是ASP没有权限在Server端写二进制文件,只能写文本,而且一旦对request对象使用了binaryread方法就不能再使用以前的request("字段名称")这种方式读取数据了,所以一般都使用拆分写入数据库或使用组件上传。(本站KKnD最近写了一个功能强大的上传组件,如有需要可以在ASP下在仓库中下载到。)

为了让大家能实际的看到数据上传效果,我提供两个ASP文件的源码,分别用来上传和分析上传数据。

上传页源码
<!--该页为普通HTML页面即可-->
<html>
<head>
<title>
</title>
</head>
<body>
<div align="center">
<form name="a" method="post" ENCTYPE="multipart/form-data" action="test1.asp?aaa=bbb&ccc=123">
<!--看结果时会发现在上面输入的调用页面的参数(aaa=bbb&ccc=123)全部丢失了,这里假设test1.asp为接收页-->
<table>
<tr><td><input type="checkbox" name=check onclick=OpenRefresh()></td></tr>
<tr><td><input type="file" name="File0"></td></tr>
<tr><td><input type="text" name="text"></td></tr>
<tr><td><input type="file" name="File1"></td></tr>
<tr><td><input type="radio" name="radio" value="radio" ></td></tr>
<tr><td><input type="radio" name="radio" value="oidar"></td></tr>
<tr><td><input type="radio" name="radio1" value="radio1"></td></tr>
<tr><td><input type="button" name="button0" value="button" ></td></tr>
<!--可以看到button按钮的value值并没有出现在上传结果中-->
</table>
<input type=submit name="submit" value="确定">
</form>
</div>
</body>
</html>

接收页源码
<%@ CODEPAGE = "936" %>
<html>
<head>
<title>
</title>
</head>
<body>
<div align="center">
<table>
<%dim FormSize,FormData%>
<tr><td><textarea cols="80" rows="25">
<%FormSize=Request.TotalBytes   ’FormSize中存储整个上传数据的字节数
FormData=Request.BinaryRead(FormSize)   ’读取全部上传数据
’BinaryRead方法通过参数确定读取的数据大小
Response.BinaryWrite FormData%>
</textarea></td></tr>
</table>
</div>
</body>
</html>



我喜欢千万法,我用压码和右脑给千万别学英语一个杠杆,撬起零基础到达自由王国;压码只有一个指标:通过滞后提高速度,速度就是质量,给它注入一个加速器,就会产生一个个奇迹.
[10 楼] | Posted:2005-04-17 11:00|
描述
快速回复

您目前还是游客,请 登录注册