当前位置:首页 » 文件管理 » httpput上传文件

httpput上传文件

发布时间: 2025-02-27 22:43:08

① ASP文件上传原理分析及实现实例

摘要 在基于/的应用环境中 上传各种类型的文件一直是困扰用户文件管理应用的难题之一 在HTTP中上传文件有三种机制 RFC PUT和WebDAV 常用的实现方法是利用在RFC 中引入的一个新类型 File以及ADO Stream对象 本文对上述上传方法及实现原理作了论述 并给出了具体解决实例 ASP FILE对象

当前 基于/模式的应用比较流行 当用户需要将文件传输到上时 常用方法之一是运行ftp并将每个用户的FTP默认目录设为用户的Web主目录 这样用户就能运行FTP客户程序并上传文件到指定的 Web目录 这就要求用户必须懂得如何使用FTP客户程序 因此 这种解决方案仅对熟悉FTP且富有经验的用户来说是可行的 如果我们能把文件上传功能与Web集成 使用户仅用Web就能完成上传任务 这对于他们来说将是非常方便的 但是 一直以来 由于File System Object的仅能传送文本文件的局限 所以ASP最大的难题就是文件上传问题 下面介绍的就是如何在基于HTTP协议的网页中实现文件的上传

一 通过HTTP上传的三种机制

通过HTTP上传有三种机制 RFC PUT 和 WebDAV

PUT 是在HTTP 引入了一个新的HTTP动词 当web收到一个HTTP PUT和对象名字 它将会验证用户 接收HTTP流的内容 并把它直接存入web 由于这可能会对一个web站点造成破坏 并且还会失去HTTP最大的优势 可编程性 在PUT的情况下 自己处理请求 没有空间让CGI或者ASP应用程序介入 唯一让你的应用程序捕获PUT的方法是在低层操作 ISAPI过滤层 由于相应的原因 PUT的应用很有限

而WebDAV允许web内容的分布式拆吵认证与翻译 它引入了几种新的HTTP动词 允许通过HTTP上传 锁定/解锁 登记/检验web内容行御知 Office 中的 Save to web 就是通过WebDAV来实现的 如果你所感兴趣的一切都是上传内容 WebDAV应用得非常出色 它解决了很多问题 然而 如果你需要在你的web应用程序里面上传文件 WebDAV对你就毫无用处可言 象HTTP PUT一样 那些WebDAV的动词是被解释的 而不是web应用程序 你需要工作在ISAPI过滤层来访问WebDAV的这些动词 并在你的应用程序中解释内容

RFC () 最终被W C在HTML 中接受前 是作为一种建议标准 它是一种非常简单但是功能很强大的想法 在表单字段中定义一个新类型 <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表示相应的 个十六进制数字 例如 即使是普通的空格字符也要用 % 代替 而RFC 使用多部分MIME编码 就象通常在e mail消息中看到的那样 不编码来传送大量数据 而只是在数据周围加上很少的简单但实用的头部 主要的厂商都采用了建议的 浏览…… 按钮 用户能很容易的使用本地 打开文件…… 对话框选择要上传的文件

RFC 仍然将大多数文件上传的灵活方法留给了你的web应用程序 PUT用得很有限 WebDAV对内容的作者很有用 比如FrontPage用户 但是对想在web应用程序中加入文件上传的web开发者来说很少用到 因此 RFC 是在web应用程序中加入文件上传的最好的办法

在实际应用中 免费提供了Posting Acceptor ASP不懂 multipart/form data 编码方案 取而代之 提供了Posting Acceptor Posting Acceptor是一种在上传完成后 接受REPOST到一个ASP页的ISAPI应用程序

Sofare Artisans的SA FileUp是最早的商业Active Server之一 几经改进 现在作为一个纯粹的ASP存在

二 基于ASP的文件上传实现原理分析

基本原理是 采用ADO Stream对象的BinaryRead方法将FORM中的所有数据读出 从中截取出所需的文件数据 以二进制文件方式存盘

下面是上传文件页面的一个例子() <><body><form name= Upload Method= Post Enctype= multipart/form data Action= Upload asp ><input type= file name= FileName ><INPUT TYPE= Submit VALUE= Upload ></TD></form></body></>

程序中使用了文件对象 这样在Upload asp中采用BinaryRead方法读来的原始数据就不仅仅是选择的文件本身的数据 还包含该文件在用户硬盘上的路径 类型 提交页面的表单等相关信息的描述 这样我们就需从中提取出文件的具体内容 根据分析 数据的头部信息与数据的分界线是两对回车换行符 尾部也有分隔信息 我们可以采用类似以下的方法获取文件数据 Dim FormData FormSize DataStart CLStr DivStrFormSize=Request TotalBytesFormData=Request BinaryRead(FormSize)CLStr=ChrB( )&ChrB( )DataStart=InStrB(FormData CLStr&CLStr)+ 是两对回车换行符的长度DivStr=LeftB(FormData InStrB(FormData CLStr) )DataSize=InStrB(DataStart+ FormData DivStr) DataStart FormData=MidB(FormData DataStart DataSize) FormData就是文件的内容了 中间根据需要 可进行相应的处理 最后的工作就是将文件保存了 保存的方法可以有两种 一种是利用VB或VC之类程序中的二进制文件操作方法 在工程中加入适当的类型库 最终编译成DLL文件 使用时再将该DLL文件注册就可以了 文件存贮程序如下 Public Function SaveFile(Pathname As String) As String Dim objContext As ObjectContext Dim objRequest As Request Set objContext=GetObjectContext() Set objRequest=objContext( Request ) 以下的一段代码是进行文件存贮的有关操作Dim FormData() As Byte CLStr DivStr Dim DataStart As Long DataSize As Long DataSize=objRequest TotalBytes Redim FormData(DataSize ) FormData=objRequest BinaryRead(DataSize) CLStr=ChrB( ) & ChrB( ) DataStart=InStrB(FormData CLStr & CLStr)+ DivStr=LeftB(FormData InStrB(FormData CLStr) ) DataSize=InStrB(DataStart+ FormData DivStr) DataStart FormData=MidB(FormData DataStart DataSize) 创建一个二进制文件并将FormData写入其中 Open Pathname For Binary As Put # FormData Close # SaveFile= OK! End Function 第二种方法是利用ADO STREAM中提供的二进制文件操作方法来完成 保存文件的语句是 StreamOBJ SaveToFile (fileName ) 在 这种操作中 我们可以将有关的操作存放在一个类文件中 在应用时 直接将该类文件包含在ASP程序中就可以了 具体处理方法 请参阅有关介绍 三.文件上传实现方法实例 实现文件上传可使用或无方式 对于类 比如说microsoft posting acceptor(简称mpa) 就是公司发布的一个免费 这类的安装也比较方便 对于的mpa 运行它的安装文件就可以了 而一般的dll形式的 我们则需要进行注册 例如 要使用aspcnUP dll 只要在Window 上执行regsvr [path]aspcnUP dll 系统出现注册成功的信息提示就可以使用该了 对于无类 如的无上传类 upload_ xsoft 在使用时 只要在处理程序中包含以下的语句就可以了 <! #include FILE= upload inc >set upload=new upload_ xSoft 建立上传对象 有关的属性与操作方法 请参阅该的使用手册 下面是詀spcnUP dll为例 上传部分类型文件的源代码(upload asp) <% @ language= vbscript Set fileUP=Server CreateObject( aspcn Upload )fileUP Maxsize= fileUP Path= d:upfile fileUP UploadFor i= to fileUP Countfieldname=fileUP FieldName(i)If fileUP FileType(fieldname)= zip Or ileUP FileType(fieldname)= rar ThenfileUP Save fieldnameEnd If NextSet fileUP=Nothing%> 四.结束语 应用模式还在快速地发展着 在ASP.NET中 已经内置了文件上传的功能 使用非常简单方便 作为一种全新的技术 ASP.NET并不只是ASP的简单升级 它是一个用于Web开发的全新框架 其中包含了许多新的特性 ASP.NET提供了更易于编写 结构更清晰的代码 利用这些代码我们将会更容易地进行再利用和共享 从而开发出更多更实用的程序来 lishixin/Article/program/net/201311/13562

② FTP,HTTP……等计算机协议及解释...

FTP(File Transfer Protocol),是文件传输协议的简称。用于Internet上的控制文件的双向传输。同时,它也是一个应用程序(Application)。用户可以通过它把自己的PC机与世界各地所有运行FTP协议的服务器相连,访问服务器上的大量程序和信息。
基本简介FTP正如其名所示FTP的主要作用,就是让用户连接上一个远程计算机(这些计算机上运行着FTP服务器程序)察看远程计算机有哪些文件,然后把文件从远程计算机上拷到本地计算机,或把本地计算机的文件送到远程计算机去。
当启动FTP从远程计算机拷贝文件时,事实上启动了两个程序:一个本地机上的FTP客户程序:它向FTP服务器提出拷贝文件的请求。另一个是启动在远程计算机的上的FTP服务器程序,它响应你的请求把你指定的文件传送到你的计算机中。FTP采用“客户机/服务器”方式,用户端要在自己的本地计算机上安装FTP客户程序。FTP客户程序有字符界面和图形界面两种。字符界面的FTP的命令复杂、繁多。图形界面的FTP客户程序,操作上要简洁方便的多。
FTP支持FTP协议的服务器就是FTP服务器,下面介绍一下什么是FTP协议。用户联网的首要目的就是实现信息共享,文件传输是信息共享非常重要的一个内容之一。Internet上早期实现传输文件,并不是一件容易的事,Internet是一个非常复杂的计算机环境,有PC,有工作站,有MAC,有大型机,据统计连接在Internet上的计算机已有上千万台,而这些计算机可能运行不同的操作系统,有运行Unix的服务器,也有运行Dos、Windows的PC机和运行MacOS的苹果机等等,而各种操作系统之间的文件交流问题,需要建立一个统一的文件传输协议,这就是所谓的FTP。基于不同的操作系统有不同的FTP应用程序,而所有这些应用程序都遵守同一种协议,这样用户就可以把自己的文件传送给别人,或者从其它的用户环境中获得文件。
工作原理FTP与大多数Internet服务一样,FTP也是一个客户机/服务器系统。用户通过一个支持FTP协议的客户机程序,连接到在远程主机上的FTP服务器程序。用户通过客户机程序向服务器程序发出命令,服务器程序执行用户所发出的命令,并将执行的结果返回到客户机。比如说,用户发出一条命令,要求服务器向用户传送某一个文件的一份拷贝,服务器会响应这条命令,将指定文件送至用户的机器上。客户机程序代表用户接收到这个文件,将其存放在用户目录中。
在FTP的使用当中,用户经常遇到两个概念:“下载”(Download)和“上载”(Upload)。“下载”文件就是从远程主机拷贝文件至自己的计算机上;“上载”文件就是将文件从自己的计算机中拷贝至远程主机上。用Internet语言来说,用户可通过客户机程序向(从)远程主机上载(下载)文件。
使用FTP时必须首先登录,在远程主机上获得相应的权限以后,方可上载或下载文件。也就是说,要想同哪一台计算机传送文件,就必须具有哪一台计算机的适当授权。换言之,除非有用户ID和口令,否则便无法传送文件。这种情况违背了Internet的开放性,Internet上的FTP主机何止千万,不可能要求每个用户在每一台主机上都拥有帐号。匿名FTP就是为解决这个问题而产生的。
匿名FTP是这样一种机制,用户可通过它连接到远程主机上,并从其下载文件,而无需成为其注册用户。系统管理员建立了一个特殊的用户ID,名为anonymous,Internet上的任何人在任何地方都可使用该用户ID。
通过FTP程序连接匿名FTP主机的方式同连接普通FTP主机的方式差不多,只是在要求提供用户标识ID时必须输入anonymous,该用户ID的口令可以是任意的字符串。习惯上,用自己的E-mail地址作为口令,使系统维护程序能够记录下来谁在存取这些文件。匿名FTP不适用于所有Internet主机,它只适用于那些提供了这项服务的主机。
当远程主机提供匿名FTP服务时,会指定某些目录向公众开放,允许匿名存取。系统中的其余目录则处于隐匿状态。作为一种安全措施,大多数匿名FTP主机都允许用户从其下载文件,而不允许用户向其上载文件,也就是说,用户可将匿名FTP主机上的所有文件全部拷贝到自己的机器上,但不能将自己机器上的任何一个文件拷贝至匿名FTP主机上。即使有些匿名FTP主机确实允许用户上载文件,用户也只能将文件上载至某一指定上载目录中。随后,系统管理员会去检查这些文件,他会将这些文件移至另一个公共下载目录中,供其他用户下载,利用这种方式,远程主机的用户得到了保护,避免了有人上载有问题的文件,如带病毒的文件。
作为一个Internet用户,可通过FTP在任何两台Internet主机之间拷贝文件。但是,实际上大多数人只有一个Internet帐户,FTP主要用于下载公共文件,例如共享软件、各公司技术支持文件等。Internet上有成千上万台匿名FTP主机,这些主机上存放着数不清的文件,供用户免费拷贝。实际上,几乎所有类型的信息,所有类型的计算机程序都可以在Internet上找到。这是Internet吸引重要原因之一。
匿名FTP使用户有机会存取到世界上最大的信息库,这个信息库是日积月累起来的,并且还在不断增长,永不关闭,涉及到几乎所有主题。而且,这一切是免费的。
匿名FTP是Internet网上发布软件的常用方法。Internet之所以能延续到今天,是因为人们使用通过标准协议提供标准服务的程序。像这样的程序,有许多就是通过匿名FTP发布的,任何人都可以存取它们。
Internet中的有数目巨大的匿名FTP主机以及更多的文件,那么到底怎样才能知道某一特定文件位于哪个匿名FTP主机上的那个目录中。这正是Archie服务器所要完成的工作。Archie将自动在FTP主机中进行搜索,构造一个包含全部文件目录信息的数据库,使你可以直接找到所需文件的位置信息。
传输步骤FTP需要进行远程文件传输的计算机必须安装和运行ftp客户程序。在windows操作系统的安装过程中,通常都安装了tcp/ip协议软件,其中就包含了ftp客户程序。但是该程序是字符界面而不是图形界面,这就必须以命令提示符的方式进行操作,很不方便。
启动ftp客户程序工作的另一途径是使用IE浏览器,用户只需要在ie地址栏中输入如下格式的url地址:ftp://[用户名:口令@]ftp服务器域名[:端口号](在CMD命令行下也可以用上述方法连接,通过put命令和get命令达到上传和下载的目的,通过ls命令列出目录,除了上述方法外还可以在cmd下输入ftp回车,然后输入openIP来建立一个连接,此方法还适用于linux下连接ftp服务器)
通过IE浏览器启动ftp的方法尽管可以使用,但是速度较慢,还回将密码暴露在IE浏览器中而不安全。因此一般都安装并运行专门的ftp客户程序。
1、在本地电脑上登陆到国际互联网。
2、搜索有文件共享主机或者个人电脑(一般有专门的FTP服务器网站上公布的,上面有进入该主机或个人电脑的名称,口令和路径)。
3、当与远程主机或者对方的个人电脑建立连接后,用对方提供的用户名和口令登陆到该主机或对方的个人电脑、
4、在远程主机或对方的个人电脑登陆成功后,就可以上传你想跟别人分享的东东或者下载别人授权共享的东东(这里的东东是指能放到电脑里去又能在显示屏上看到的东东)。
5、完成工作后关闭FTP下载软件,切断连接。
为了实现文件传输,用户还要运行专门的文件传输程序,比如网际快车就有这方面的功能,其它还有很多专门的FTP传输软件,FlashFxp为其中的杰出软件。有兴趣的网友可以试试其他的软件,如LeapFTP总归各有各的特色。
通信协议FTPTCP/IP协议中,FTP标准命令TCP端口号为21,Port方式数据端口为20。FTP协议的任务是从一台计算机将文件传送到另一台计算机,它与这两台计算机所处的位置、联接的方式、甚至是是否使用相同的操作系统无关。假设两台计算机通过ftp协议对话,并且能访问Internet,你可以用ftp命令来传输文件。每种操作系统使用上有某一些细微差别,但是每种协议基本的命令结构是相同的。
FTP的传输有两种方式:ASCII传输模式和二进制数据传输模式。
1、ASCII传输方式:假定用户正在拷贝的文件包含的简单ASCII码文本,如果在远程机器上运行的不是UNIX,当文件传输时ftp通常会自动地调整文件的内容以便于把文件解释成另外那台计算机存储文本文件的格式。但是常常有这样的情况,用户正在传输的文件包含的不是文本文件,它们可能是程序,数据库,字处理文件或者压缩文件(尽管字处理文件包含的大部分是文本,其中也包含有指示页尺寸,字库等信息的非打印字符)。在拷贝任何非文本文件之前,用binary命令告诉ftp逐字拷贝,不要对这些文件进行处理,这也是下面要讲的二进制传输。
2、二进制传输模式:在二进制传输中,保存文件的位序,以便原始和拷贝的是逐位一一对应的。即使目的地机器上包含位序列的文件是没意义的。例如,macintosh以二进制方式传送可执行文件到Windows系统,在对方系统上,此文件不能执行。如果你在ASCII方式下传输二进制文件,即使不需要也仍会转译。这会使传输稍微变慢,也会损坏数据,使文件变得不能用。(在大多数计算机上,ASCII方式一般假设每一字符的第一有效位无意义,因为ASCII字符组合不使用它。如果你传输二进制文件,所有的位都是重要的。)如果你知道这两台机器是同样的,则二进制方式对文本文件和数据文件都是有效的。
3、FTP的工作方式:FTP支持两种模式,一种方式叫做Standard(也就是PORT方式,主动方式),一种是Passive(也就是PASV,被动方式)。Standard模式FTP的客户端发送PORT命令到FTP服务器。Passive模式FTP的客户端发送PASV命令到FTPServer。
下面介绍一个这两种方式的工作原理:
Port模式FTP客户端首先和FTP服务器的TCP21端口建立连接,通过这个通道发送命令,客户端需要接收数据的时候在这个通道上发送PORT命令。PORT命令包含了客户端用什么端口接收数据。在传送数据的时候,服务器端通过自己的TCP20端口连接至客户端的指定端口发送数据。FTPserver必须和客户端建立一个新的连接用来传送数据。
Passive模式在建立控制通道的时候和Standard模式类似,但建立连接后发送的不是Port命令,而是Pasv命令。FTP服务器收到Pasv命令后,随机打开一个高端端口(端口号大于1024)并且通知客户端在这个端口上传送数据的请求,客户端连接FTP服务器此端口,然后FTP服务器将通过这个端口进行数据的传送,这个时候FTPserver不再需要建立一个新的和客户端之间的连接。
很多防火墙在设置的时候都是不允许接受外部发起的连接的,所以许多位于防火墙后或内网的FTP服务器不支持PASV模式,因为客户端无法穿过防火墙打开FTP服务器的高端端口;而许多内网的客户端不能用PORT模式登陆FTP服务器,因为从服务器的TCP20无法和内部网络的客户端建立一个新的连接,造成无法工作。

③ 怎么用http上传一个文件到服务器 python

首先,标准HTTP协议对上传文件等表单的定义在这里:wwwietforg/rfc/rfc1867txt 大概数据包格式如下:

单文件:

Content-type: multipart/form-data, boundary=AaB03x

--AaB03x
content-disposition: form-data; name="field1"

Joe Blow
--AaB03x
content-disposition: form-data; name="pics"; filename="file1.txt"
Content-Type: text/plain

... contents of file1.txt ...
--AaB03x--
多文件:

Content-type: multipart/form-data, boundary=AaB03x

--AaB03x
content-disposition: form-data; name="field1"

Joe Blow
--AaB03x
content-disposition: form-data; name="pics"
Content-type: multipart/mixed, boundary=BbC04y

--BbC04y
Content-disposition: attachment; filename="file1.txt"
其次,python上传文件的几种方法:

1 自己封装HTTP的POST数据包:http//stackoverflowcom/questions/680305/using-multipartposthandler-to-post-form-data-with-python

import httplibimport mimetypesdef post_multipart(host, selector, fields, files): content_type, body = encode_multipart_formdata(fields, files) h = httplib.HTTP(host) h.putrequest('POST', selector) h.putheader('content-type', content_type) h.putheader('content-length', str(len(body))) h.endheaders() h.send(body) errcode, errmsg, headers = h.getreply() return h.file.read() def encode_multipart_formdata(fields, files): LIMIT = '----------lImIt_of_THE_fIle_eW_$' CRLF = '\r\n' L = [] for (key, value) in fields: L.append('--' + LIMIT) L.append('Content-Disposition: form-data; name="%s"' % key) L.append('') L.append(value) for (key, filename, value) in files:

热点内容
光遇安卓换绑后怎么登录 发布:2025-02-28 02:51:32 浏览:870
wifi密码忘记了怎么找回来 发布:2025-02-28 02:50:56 浏览:77
pythontxt换行 发布:2025-02-28 02:44:23 浏览:716
eve星战前夜脚本会封号吗 发布:2025-02-28 02:44:23 浏览:959
linux时间同步设置 发布:2025-02-28 02:43:40 浏览:60
用友服务器加密码怎么设置 发布:2025-02-28 02:42:23 浏览:621
安卓实例源码 发布:2025-02-28 02:40:47 浏览:564
安卓时间规划局怎么设置动态的 发布:2025-02-28 02:36:36 浏览:29
社会评价数据库 发布:2025-02-28 02:28:14 浏览:70
电脑搭建邮局服务器 发布:2025-02-28 02:08:55 浏览:891