使用CFFILE
使用CFFILE
CFFILE标签使你能以几种不同的方式进行服务器端的文件操作:
· 利用HTML表单,从客户端将文件上载到服务器。
· 移动,重命名,复制或删除服务器上的文件。
·
对服务器上的文本文件进行读、写或追加操作。
要设置的属性依赖于ACTION属性的值,例如,如果设定ACTION=“Write”,则需要设置
与写文本文件有关的属性。
注意:在允许用户访问服务器上的文件之前,应考虑安全性以及目录结构等问题。
文件上载
文件上载
实现文件上载需要建立两个文件:
· 一个HTML表单,用于输入文件上载信息。
· 一个包含文件上载代码的cfm文件。
建立用于文件上载的HTML表单
大多数浏览器都支持文件上载。将HTML INPUT标签的类型设为“file”,则浏览器会准
备从客户端读取并传输一个文件给服务器。将ENCTYPE属性设为
“multipart/form-data”,则服务器会知道表单的提交包含了一个上载的文件。
例子:一个用于文件上载的HTML表单
<FORM ACTION="FileUpload.cfm"
ENCTYPE="multipart/form-data"
METHOD="Post">
<PRE>
File Name: <INPUT NAME="FileName"
TYPE="text">
File: <INPUT NAME="FileContents" TYPE="file">
<INPUT TYPE="submit" VALUE="Upload File">
</PRE>
</FORM>
用户可以输入一个文件的路径,或浏览本地的文件系统并选择一个要上载的文件。注意
必须将ENCTYPE属性设置为“multipart/form-data”。
建立一个文件上载的程序文件
提交一个文件后,该文件还没有保存到服务器上。它只是被译码然后与其它的表单数据
一起被传递给ACTION属性所指的程序文件,在该文件中由CFFILE标签对上载的文件进行
解码并保存到服务器上。
例子:上载一个文件
下面例子中的CFFILE标签可以放置在上一例子中所指的“FileUpload.cfm”文件中:
<CFFILE ACTION="UPLOAD"
FILEFIELD="FileContents"
DESTINATION="C:/Web/Uploads/">
如果请求此文件的文件上载表单传递了一个名为keyMemo.doc文件,则该文件在服务器
上被保存为:
C:/web/Uploads/keyMemo.doc
要以另外的文件名保存上载的文件,可以在DESTINATION属性中指定新文件名。在下面
的例子中,文件“keyMemo.doc”被保存为“UploadedFile.doc”:
<CFFILE ACTION="UPLOAD"
FILEFIELD="FileContents"
DESTINATION="C:/Web/Uploads/UploadedFile.doc">
你也可以将这些属性设置为动态参数。例如,你可以根据数据库查询的结果来设定文件
名。
注意:FILEFIELD属性应设定为一个Form字段的名字,而不是Form字段的值,因此不能
将字段名括在#号中。
处理文件名冲突
将一个文件保存到服务器上时,有可能已经有另一个同名的文件存在,在这种情况下,
利用NAMECONFLICT属性,你可以采取多种处理方法。
例子:解决文件名冲突
在下面的例子中,如果文件上载时发生名字冲突,程序会生成一个唯一的文件名,文件
后缀名保持不变:
<CFFILE ACTION="Upload"
FILEFIELD="FileContents"
DESTINATION="C:/Web/Uploads/"
NAMECONFLICT="MAKEUNIQUE">
控制上载文件的类型
对某些应用程序,你也许需要限制上载文件的类型。例如,在一个文档库中,你也许不
想接受图形文件。
ACCEPT属性用于限制允许上载的文件类型。指定了ACCEPT属性后,被上载文件的MIME内
容类型必须与指定的条件相匹配,否则就会产生错误。ACCEPT属性的值是一列由逗号隔
开的MIME数据类型名,其中可以使用通配符。
一个文件的MIME类型决定于浏览器,普通的类型如“image/gif”和“text/plain”等
已在浏览器中注册。
例子:限制文件类型
这个CFFILE 只保存GIF格式的图象文件:
<CFFILE ACTION="Upload"
FILEFIELD="UploadFile"
DESTINATION="c:/uploads/MyImage.GIF"
NAMECONFLICT="OVERWRITE"
ACCEPT="image/gif">
这个CFFILE 只保存GIF格式或JPEG格式的图象文件:
<CFFILE ACTION="Upload"
FILEFIELD="UploadFile"
DESTINATION="c:/uploads/MyImage.GIF"
NAMECONFLICT="OVERWRITE"
ACCEPT="image/gif, image/jpeg">
这个CFFILE只保存图象文件,但对其格式没有限制:
<CFFILE ACTION="Upload"
FILEFIELD="UploadFile"
DESTINATION="c:/uploads/MyImage.GIF"
NAMECONFLICT="OVERWRITE"
ACCEPT="image/*">
注意:如果ACCEPT属性被忽略或设为空或设为“*/*”,则所有类型的文件都可以被上
载。
设置文件和目录的属性
设置文件和目录的属性
在Windows中,用CFFILE的ATTRIBUTES属性定义文件属性;在UNIX中,用CFFILE和
CFDIRECTORYMDE属性定义文件和目录权限。
UNIX
在UNIX中,你可以对文件和目录设置权限。MODE属性的值相对应于UNIX命令chmod的十
进制数值。
· 4=读
· 2=读/写
· 1=读/写/执行
你应按照“所有者,组,其它用户”的顺序,为每种类型的用户设置权限值。例如,为
所有用户设置读权限:
MODE=444
Windows
在Windows中,你可以设置下面的文件属件:
????????· ReadOnly
????????· Temporary
????????· Archive
????????· ?Hidden
????????· ?System
????????· ?Normal
如果不使用ATTRIBUTES属性,则文件现有的属性被保留。如果同时指定了Normal属性和
任何其它属性,则Normal属性被其它属性所覆盖。
例子:设置文件属性
这个例子将上载的文件设为Archive属性:
<CFFILE ACTION=”copy”
SOURCE=”c:/files/upload/keymemo.doc”
DESTINATION=”c:/files/backup/”
ATTRIBUTES=”Archive”>
评价文件上载的结果
评价文件上载的结果
完成文件上载之后,你可以利用文件上载变量获取状态信息。状态信息包括与上载文件
有关的各种数据,如文件名和保存的路径等。
文件上载状态变量的推荐用法是使用CFFILE前缀,例如CFFILE.ClientDirectory。为了
向后兼容,File前缀仍可以使用。在任何可以使用ColdFusion变量的地方都可以使用文
件状态变量。
完成文件上载之后,下表中的各个状态变量即可以被引用:
文件上载变量
参数
描述
AttemptedServerFile
ColdFusion最初用来存储被上载文件的文件名,如myfile.txt。
ClientDirectory
被上载文件在客户系统中的目录位置。
ClientFile
被上载文件在客户系统中的文件名,如myfile.txt。
ClientFileExt
被上载文件在客户系统中的扩展名,不包括句号,如txt(而不是.txt)。
ClientFileName
被上载文件在客户系统中的文件名,不包括后缀名。
ContentSubType
被上载文件的MIME内容子类型,例如对image/gif即为gif。
ContentType
被上载文件的MIME内容类型,例如对image/gif即为image。
DateLastAccessed
被上载文件最后一次被访问的时间。
FileExisted
指明是否(yes或no)相同路径的文件已经存在。
FileSize
被上载文件的大小。
FileWasAppended
指明是否(yes/no)要ColdFusion将被上载文件追加到一个已经存在的文件中。
FileWasOverwritten
指明是否(yes/no)要ColdFusion覆盖一个文件。
FileWasRenamed
指明被上载文件是否(yes/no)因文件名冲突而被重命名。
FileWasSaved
指明ColdFusion是否保存了一个文件。
OldFileSize
在文件上载操作中被覆盖的文件的大小。
ServerDirectory
服务器上实际保存了被上载文件的目录。
ServerFile
实际保存到服务器上的文件名。
ServerFileExt
被上载文件在服务器上的文件后缀名,不包括句号,如txt。
ServerFileName
被上载文件在服务器上的文件名,不包括后缀名。
TimeCreated
被上载文件的创建时间。
TimeLastModified
被上载文件最后一次被修改的日期和时间。
引用这些变量时可以使用File前缀或CFFILE前缀,如#File.FileExisted#。
注意:文件状态变量是只读的。这些变量的值是最近一次CFFILE操作的执行结果,如果
执行了两个CFFILE标签,则第一个标签的执行结果被第二个所覆盖。
移动、重合名、复制和删除服务器端文件
移动、重合名、复制和删除服务器端文件
利用CFFILE,你可以对服务器上的文件进行移动、重命名、复制和删除等文件操作,在
下面的这些例子中,许多属性值均被设置为静态值,但是,CFFILE标签的所有属性的值
均可包含动态参数,这使得CFFILE的功能非常强大。
移动一个文件(ACTION=“MOVE”)
用CFFILE可以将服务器上的文件从一个位置移动到另一个位置。如下例,文件
“KeyMemo.doc”被从C:/files/upload/目录移动到C:/files/memo/目录:
<CFFILE ACTION="MOVE"
SOURCE="c:/files/upload/KeyMemo.doc"
DESTINATION="c:/files/memo/">
重命名一个文件(ACTION=“PENAME”)
用CFFILE可以将服务器上的文件重命名。如下例,文件KeyMemo.doc被重命名为
oldmemo.doc:
<CFFILE ACTION="Rename"
SOURCE="c:/files/memo/KeyMemo.doc"
DESTINATION="c:/files/memo/OldMemo.doc">
复制一个文件(ACTION=”COPY”)
用CFFILE可以将服务器上的文件从一个目录复制到另一个目录。下面的例子将文件
KeyMemo.doc的一个备份保存到C:/files/backup/目录:
<CFFILE ACTION="Copy"
SOURCE="c:/files/upload/KeyMemo.doc"
DESTINATION="c:/files/backup/">
删除一个文件(ACTION=“DELETE”)
用CFFILE可以删除服务器上的文件,下面的例子将指定的文件永久性删除:
<CFFILE ACTION="Delete"
FILE="c:/files/upload/攐ldfile.txt">
读、写和追加一个文本文件
读、写和追加一个文本文件
用CFFILE不仅可以操作服务器上的文件,还可以对文本文件进行读取,创建和修改。这
使你能够:
· 建立日志文件
· 生成静态HTML文档
·
用文本文件存储可以添加到网页中的信息
读文本文件(ACTION=“READ”)
你可以用CFFILE来读取一个已经存在的文本文件。文件被读取到一个动态参数中,你可
以在程序文件的任何位置使用该动态参数。例如,你可以读取一个文本文件,然后将其
内容插入到数据库中,你还可以读取文件然后使用查找和替换函数修改其内容。
下面的例子创建一个变量“Message”,用该变量保存文件“message.txt”的内容:
<CFFILE ACTION="Read"
FILE="C:/Web/message.txt"
VARIABLE="Message">
于是在应用程序文件中即可以使用变量“Message”。例如,你可以在网页中显示文件
message.txt的内容:
<CFOUTPUT>#Message#</CFOUTPUT>
写文本文件(ACTION=“WRITE”)
你可以用CFFILE根据动态内容写一个文本文件。例如,你可以建立一个HTML文件或日志
文件。
下面的例子用用户输入一个HTML插入表单中的信息建立一个文件:
<CFFILE ACTION="Write"
FILE="C:/files/updates/#Form.UpdateTitle#.txt"
OUTPUT="Created By: #Form.FullName#
Date: #Form.Date#
#Form.Content# ">
如果用户输入如下的信息并提交表单:
UpdateTitle="FieldWork"
FullName="John Lunch"
Date="10/1/98"
Content="We had a wonderful time in Cambridgeport."
则ColdFusion会在C:/files/updates/目录下建立一个文件Fieldwork.txt,该文件中包
含如下文本:
Created By: John Lunch
Date: 10/1/98
We had a wonderful time in Cambridgeport.
追加一个文本文件(ACTION=“APPEND”)
用CFFILE可以向一个已经存在的文本文件中追加文本,如日志文件。下面的例子向文件
Fieldwork.txt中追加一个字符串“But
Davis Square was more fun.”:
<CFFILE ACTION="Append"
DESTINATION="C:/files/updates/FieldWork.txt"
OUTPUT="<B>But Davis Square was more
fun.</B>">
执行目录操作
执行目录操作
CFDIRECTORY标签用于返回指定目录的文件信息,并可以对目录进行创建,删除和重命
名等操作。
与CFFILE一样,在ColdFusion Administrator中可以禁止CFDIRECTORY标签。
CFDIRECTORY的各属性如下表所列:
CFDIRECTORY 属性
属性
描述
ACTION
可选。定义要对DIRECTORY属性中指定的目录所执行的操作。合法的输入包括:
· List
· Create
· Delete
· Rename
缺省值为List.
DIRECTORY
要对之执行目录操作的目录名。
NAME
目录列表输出的查询名。ACTION=”List”时要指定此属性,其他操作忽略此属性。
FILTER
用于过滤返回的文件名,如”*.cfm”。ACTION=”List”时可指定此属性,其他操作忽
略此属性。
MODE
可选。只在Solaris中,在ACTION=”Create”时使用,用于设置一个目录的许可权限。
在Windows中将被忽略。
其合法取值对应于UNIX的chmod命令的十进制值。许可权限按照“所有者,组,其它”
的顺序分别设置。例如:
MODE=644
赋予所有者读/写权限,组和其它用户被赋予读权限。
SORT
ACTION=”List”时可选,对其它操作被忽略。可用此属性指定一列字段名,相互间用
逗号隔开,根据这些字段对输出的目录列表进行排序。对每个字段可指定ASC或DESC,
按升序或降序排序。例如:
SORT=”colname
ASC,filename2 DESC,size,datelastmodified”
NEWDIRECTORY
DIRECTORY属性中指定的目录的新目录名。ACTION=”Rename”时要指定此属性,其它操
作忽略该属性。
返回文件信息(ACTION=“LIST”)
当ACTION=“LIST”时,CFDIRECTORY返回五个变量,你可以在CFOUTPUT中引用这些变量:
· Name——目录名或文件名。
· Size——目录大小或文件大小。
· Type——文件类型:F代表文件,D代表目录。
· DateLastModified——最后一次被
修改的时间。
· Attributes——文件属性。
· Mode——(仅Solaris支持)代表指定目录的权限设置的十进制数。
例子
你可以在CFML扩展中使用查询结果字段,只需以查询名作为字段名的前缀。
<CFDIRECTORY
DIRECTORY="c:/winnt/system32"
NAME="mydirectory"
SORT="size ASC, name DESC, datelastmodified">
<CFOUTPUT QUERY=”mydirectory”>
Name: #mydirectory.name# <BR>
Size: #mydirectory.size# <BR>Type: #mydirectory.type# <BR>
Date last modified: #mydirectory.datelastmodified# <BR>
Attributes: #mydirectory.attributes#<BR>
Mode: #mydirectory.mode#<BR>
</CFOUTPUT>
建立连接
CFFTP标签使你能够通过文件传输协议(ftp)与远程服务器相交互。这是服务器与服务
器之间的文件操作。要实现服务器与浏览器之间的文件操作,应使用CFFILE,
CFCONTENT和CFDIRECTORY标签。
建立连接
CFFTP的使用涉及两种类型的操作,建立连接和传输文件。
注意:CFFTP是一个COM对象,Microsoft Windows NT 3.51不支持此对象。
例子:FTP登录
下面的例子演示了一个打开的FTP连接,并提供了用户名和密码。
<CFFTP
CONNECTION=FTP
USERNAME="betauser"
PASSword="monroe"
SERVER="beta.company.com"
ACTION="Open"
STOPONERROR="No">
CFFTP标签要求指定USERNAME和PASSword属性,为此当建立匿名连接时,要以
“anonymous”作为用户名,以一个email地址作为密码。
文件和目录操作
建立连接之后,你就可以与所连接的FTP服务器进行交互,执行文件和目录操作。实现
文件和目录操作的CFFTP标签的各属性如下表所列:
CFFPT文件和目录操作属性
属性
描述
ACTION
如果连接没有被缓冲,则需要此属性,否则不需要。
指明要执行的FTP操作,这些操作可以是下列之一:
· ChangeDir
· CreateDir
· ListDir
· GetFile
· PutFile
· Rename
· Remove
· GetCurrentDir
· GetCurrentURL
· ExistsDir
· ExistsFile
· Exists
注意:文件名和目录名是区分大小写的。例如,对test.log执行ListDir操作不会找到
test.LOG。
USERNAME
用于建立FTP连接的用户名。如果连接已经被缓冲,则不需要此属性。
PASSword
用于建立连接的密码。如果连接已经被缓冲,则不需要此属性。
NAME
当ACTION=”ListDir”时需要此属性,用于指定用来保存目录列表的查询名。
SERVER
要与之建立连接的服务器名。如果连接已经被缓冲,则不需要此属性。
TIMEOUT
可选。用于指定所有操作的超时秒数。缺省值是30秒。
PORT
可选。用于指定远程服务器的端口号。
CONNECTION
可选。指定FTP连接的名字,用于缓冲当前的FTP连接或重用已缓冲的FTP连接。所有使
用相同连接名的CFFTP都使用相同的连接信息。
ASCIIEXTENSIONLIST
可选。一列用分号隔开的文件扩展名,用于在TRANSFERMODE=”Autodetect”时强制进
行ASCII传输模式。缺省的扩展名列表是:
txt;htm;HTML;cfm;cfml;shtm;sHTML;CSS;ASP;asa
TRANSFERMODE
可选。指定你要用的FTP传输模式。合法的输入有ASCII,Binary,或Autodetect。缺省值
是Autodect.
AGENTNAME
可选。管理传输的应用程序。
FAILIFEXISTS
可选。其值为Yes或NO,缺省为Yes。用于指明当同名的文件已经存在时,GetFile操作
是否失败。
DIRECTORY
当ACTION=ChangeDir,CreateDir,ListDir,ExistsDir时需要此属性。用于指定要对之进
行操作的目录。
LOCALFILE
当ACTION=GetFile,PutFile时需要此属性。用于指定用户本地文件系统中的文件名。
REMOTEFILE
当ACTION=GetFile,PutFile,ExistsFile时需要此属性。用于指定FTP服务器上文件系统
中的文件名。
ATTRIBUTES
可选。一列用逗号隔开的文件属性。缺省值为”Normal”。用于在GetFile操作中指定
本地文件的文件属性。其值可以是下列值的任意组合:
· ReadOnly
· Hidden
· System
· Archive
· Directory
· Compressed
· Temporary
· Normal
ITEM
当ACTION=Exists,Remove时需要此属性。用于指定这些操作的对象,文件或目录。
EXISTING
当ACTION=Rename时需要此属性。指定远程服务器上文件或目录的当前名字。
NEW
当ACTION=Rename时需要此属性。指定远程服务器上文件或目录的新名字。
RETRYCOUNT
可选。报错之前的重试次数。缺省值是1。
STOPONERROR
可选。其值为Yes或No,缺省值为NO。当为Yes时,停止所有的处理并显示合适的错误信
息;当为No时,产生三个变量:
· CFFTP.Succeeded---Yes 或NO.
· CFFTP.ErrorCode---错误号。
· CFFTP.ErrorText---解释错误情况的错误信息。
连接缓存
一旦用CFFTP建立了一个连接,你可以再次使用该连接,执行附加的FTP操作。要实现这
一点,在第一次建立连接时要用CONECTION属性定义并命名一个FTP连接对象。此对象用
于保存与连接有关的信息,任何附加的FTP操作只要使用相同的CONECTION名字,即可自
动使用存储在连接对象中的信息。这项特性节省了连接和登录到FTP服务器的时间,从
而提高了文件传输操作的效率。
当你使用一个FTP连接时,你不需要重新指定下列属性:
· USERNAME
· PASSword
· SERVER
在这种情况下,如果使用了框架(frame),则你应确保当多个请求同时到达时,只有
一个框架将使用连接对象。
跨多个文件的连接缓存
CFFTP缓存只能维持在当前的网页中,除非你显式地将一个CFFTP连接分配给一个应用程
序范围或session范围的变量。将一个CFFTP连接分配给一个Application变量对象有可
能会出现问题,因为有可能会有多个用户同时访问同一个连接对象。为CFFTP连接创建
一个Session变量是比较合适的。
将FTP连接名分配给一个session变量即可实现session范围内的连接缓存。如下例所示:
<CFFTP ACTION=connect
USERNAME="anonymous"
PASSword="me@home.com"
SERVER="ftp.eclipse.com"
CONNECTION="Session.myconnection">
在这个例子中,连接缓存在当前Session的所有程序文件中有效。当然,你首先应确保
你的应用程序允许了Session变量。
注意:要修改一个缓存的连接,例如改变RETRYCOUNT或TIMEOUT的值,则必须重新建立
该连接。
连接缓存的操作和属性
下表显示了使用连接缓存进行各种操作所需的CFFTP属性,如果没有使用连接缓存,则
还需指定USERNAME,
PASSword和SERVER属性。
CFFTP各操作所需的属性
操作
属性
操作
属性
Open
无
Rename
EXISTING
NEW
Close
无
Remove
SERVER
ITEM
ChangeDir
DIRECTORY
GetCurrentDir
无
CreateDir
DIRECTORY
GetCurrentURL
无
ListDir
NAME
DIRECTORY
ExistsDir
DIRECTORY
GetFile
LOCALFILE
REMOTEFILE
ExistsFile
REMOTEFILE
PutFile
LOCALFILE
REMOTEFILE
Exists
ITEM
例子:一个FTP Session
下面的例子打开一个FTP连接,获取文件列表,显示文件或目录的名字,路径,URL,长
度,以及修改日期。例中使用了连接缓存,并允许了自动检测错误。
<--- open FTP connection --->
<CFFTP CONNECTION=FTP
USERNAME="betauser"
PASSword="monroe"
SERVER="beta.company.com"
ACTION="Open"
STOPONERROR="Yes">
<--- get current directory name --->
<CFFTP CONNECTION=FTP
ACTION="GetCurrentDir"
STOPONERROR="Yes">
<--- output directory name --->
<CFOUTPUT>
FTP directory listing of #cfftp.returnvalue#.<p>
</CFOUTPUT>
<--- get directory info --->
<CFFTP CONNECTION=FTP
ACTION="listdir"
DIRECTORY="/*."
NAME="q"
STOPONERROR="Yes">
<--- output dir-list results --->
<HR>
<P>FTP Directory Listing:</P>
<CFTABLE QUERY="q" HTMLTABLE>
<CFCOL HEADER="<B>Name</B>"
TEXT="#name#">
<CFCOL HEADER="<B>Path</B>"
TEXT="#path#">
<CFCOL HEADER="<B>URL</B>"
TEXT="#url#">
<CFCOL HEADER="<B>Length</B>"
TEXT="#length#">
<CFCOL HEADER="<B>LastModified</B>"
TEXT="Date(Format#lastmodified#)">
<CFCOL HEADER="<B>IsDirectory</B>"
TEXT="#isdirectory#">
</CFTABLE>
CFFTP变量
CFFTP操作返回下列变量:
·
CFFTPResult.ReturnValue
·
当ACTION属性为“ListDir”时,返回CFFTP查询对象。
·
当STOPONERROR属性值为“NO”时,创建三个变量。
CFFTPResult.ReturnValue
变量CFFTPResult.ReturnValue的值决定于CFFTP的ACTION属性。
CFFTPResult.ReturnValue
CFFTP ACTION
CFFTPResult.ReturnValue变量的值
GetCurrentDir
当前目录的字符串值
GetCurrentURL
当前URL的字符串值
ExistsDir
Yes或No
ExistsFile
Yes或No
Exists
Yes或No
STOPONERROR变量
当STOPONERROR属性被设置为“NO”时,将创建如下的变量:
·
CFFTP.Succeeded——Yes或NO
·
CFFTP.ErrorCode——错误码(参见下面的CFFTP.Errorcode值)
·
CFFTP.ErrorText——解释错误情况的文本信息。
下表列出了CFFTP.ErrorCode变量的可能值:
CFFTP.ErrorCode变量的值
错误码
描述
0
操作成功
1
系统错误
2
无法建立Internet会话
3
无法打开FTP会话
4
无法识别文件传输模式
5
无法建立搜索连接
6
被调用的操作只有在搜索时才合法
7
非法的超时值
8
非法的端口号
9
没有足够的内存
10
本地文件不可读取
11
本地文件不可写入
12
无法打开远程文件
13
无法读取远程文件
14
无法打开本地文件
15
不能写入远程文件
16
未知错误
17
保留
18
文件已经存在
19
保留
20
保留
21
非法的重试次数
CFFTP查询对象的属性
当你使用CFFTP的ListDir操作时,你必须指定NAME属性的值。NAME属性的值用于将
ListDir操作的查询结果保存在一个查询对象中。这个查询对象的各个字段可以用如下
的格式来引用:
queryname Columnname[row]
其中queryname即是在NAME属性中指定的查询名,Columnname是返回到查询对象中
的各字段之一,Row是由ListDir操作所返回的每个文件/目录项的行号,每个文件或子
目录都占用单独的一行。
下表列出了查询对象中的各个字段。
CFFTP查询对象字段
字段
描述
Name
当前元素的文件名
Path
当前元素的文件路径(不包括盘符)
URL
当前元素(文件或目录)的完整URL
Length
当前元素的文件大小
LastModified
当前元素的未格式化的日期/时间
Attributes
当前元素的属性
Isdirectory
布尔值,指明当前元素是文件还是目录
使用CFHTTP与Web相交互
CFHTTP标签是功能最强大的CFML标签之一,它可以用来:
·
从网络上获取网页和查询结果。
· 向远程服务器,CFML模板或CGI应用程序传送数据并处理返回数据。
超文本传输协议(HTTP)处理Web服务器之间的各种通信。执行一个事务处理所采取的
方法决定了服务器处理什么以及什么内容被传送给浏览器。除了HTML文档之外,HTTP还
支持二进制文件,图象、音频和视频等内容类型。HTTP协议标准规定,用户的请求信息
和服务器的响应信息,以及事务处理的状态信息均以请求标题和响应标题的形式被传递。
HTTP协议有几种通信方法,用于在客户和服务器之间交换信息。CFHTTP标签实现了最常
用的HTTP通信方法:GET和POST.
CFHTTP的语法非常简单,但它提供了许多选项,用于指定输出,处理链接以及建立查询
等任务。
CFHTTP的语法
CFHTTP 标签的基本语法如下:
<CFHTTP URL=" hostname"
USERNAME=" username"
PASSword=" password"
NAME=" queryname"
COLUMNS=" query_columns"
PATH=" path"
FILE=" filename"
METHOD=" get_or_post"
DELIMITER=" character"
TEXTQUALIFIER=" character"
RESOLVEURL=" Yes/No"
PROXYSERVER=" hostname">
</CFHTTP>
处理所获网页中的链接
要保持通过CFHTTP从Web服务器获取的网页中的相对链接,应将RESOLVEURL属性设为
“Yes”。当RESOLVEURL=YES时,下列可能包含链接的标签会被处理:
· IMG SRC
· A HREF
· RORM ACTION
· APPLET CODE
· SCRIPT SRC
· EMBED SRC
· EMBED PLUGINSPACE
· BODY BACKGROUND
· FRAME SRC
· BGSOUND SRC
· OBJECT DATA
· OBJECT CLASSID
· OBJECT C0DEBASE
· OBJECT USEMAP
注意:如果获取的网页中某个URL指向一个二进制文件,则该网页不被显示。你可以输
入一个路径作为PATH属性的值,从而把该二进制文件保存到本地计算机中。
使用CFHTTP的Get方法
Get方法于从指定的服务器获取文本文件或二进制文件。下面的几个例子演示了几种常
用的Get操作。Get方法是一种单向的事务处理方法,CFHTTP用这种方法获得一个对象,
而Post方法是双向的处理方法,CFHTTP用Post方法向ColdFusion文件或CGI程序传递变
量,并接收和处理返回的数据。
例子:获取到变量中
下面的例子用Get方法请求Yahoo站点的缺省主页,并将文件内容保存到一个变量中,然
后用CFOUTPUT将该变量的内容显示在浏览器中。
<CFHTTP METHOD="Get"
URL="http://www.yahoo.com/index.htm"
RESOLVEURL="Yes">
<CFOUTPUT>
#CFHTTP.FileContent# <BR>
</CFOUTPUT>
当FILE属性和PATH属性被忽略时,ColdFusion将文件index.htm的内容保存到变量
CFHTTP.FileContent中。要注意的是,若不把RESOLVEURL属性设为“Yes”,则下载的
网页中相对链接会被打断。若将该属性设为“Yes”,则相对链接会被转换为绝对链接。
例子:获取到一个文件中
下面的例子也用Get方法执行一个简单的文件请求,但PATH属性和FILE属性的使用导致
下载的文件被保存到本地的文件中。
<CFHTTP METHOD = "get"
URL="http://www.yahoo.com/index.htm"
PATH="c:/temp"
FILE="yahooindex.htm">
注意,当使用了PATH属性和FILE属性时,RESOLVEURL属性会被忽略(即使指定了该属性,
也将被忽略)。
例子:获取一个二进制文件
与上一个例子相似,这个例子也从服务器下载一个文件并保存到PATH属性和FILE属性所
指定的位置。唯一的不同是被下载文件的MIME类型不一样。
<CFHTTP METHOD="Get"
URL="http://maximus/downloads/quakestuff/q2_test.zip"
PATH="c:/quake2/install"
FILE="quake2beta.zip">
<CFOUTPUT>
#CFHTTP.MimeType#
</CFOUTPUT>
CFOUTPUT代码块显示了被下载文件的MIME类型,在此例中是application/zip。
根据一个文本文件建立查询
使用CFHTTP的Get方法,你可以根据一个有分隔符的文本文件创建查询对象。这是处理
生成的文本文件的一个有力方法。一旦查询对象创建之后,对查询字段的引用和处理是
非常简单的。
文本文件的处理方式如下:
· 用DELIMITER属性指定一个分隔符。如果某个字段的数据包含分隔符本身,则
必须将其括在引号中或括在某个其它字符中,你可以用TEXTQUALIFIER属性指定该字符。
·
缺省情况下,文本文件的第一行被解释为字段标题文本。你可以在COLUMNS属性中指定
替代的标题文本。如果这样,你应确保为文本文件的每一列都指定了替代的标题文本。
·
当遇到重复的字段标题时,ColdFusion为重复的字段名添加一个下划线字符。例如,如
果发现两个字段标题都是CustomerID,则第二个字段标题被更名为“CustomerID_”。
例子:根据一个文本文件创建查询
这个例子根据一个以逗号为分隔符的文本文件创建一个查询对象。该文本文件有六列数
据,互相以逗号分隔,文件的第一行为:
OrderID,OrderNum,OrderDate,ShipDate,ShipName,ShipAddress
这个例子接受文本文件的第一行作为字段名:
<CFHTTP METHOD="Get"
URL="http://127.0.0.1/orders/june/orders.txt"
NAME="juneorders"
DELIMITER=","
TEXTQUALIFIER="""">
<CFOUTPUT QUERY="juneorders">
OrderID: #OrderID#<BR>
Order Number: #OrderNum#<BR>
Order Date: #OrderDate#<BR>
</CFOUTPUT>
你可用COLUMNS属性指定不同与上例的字段名:
<CFHTTP METHOD="Get"
URL="http://127.0.0.1/orders/june/orders.txt"
NAME="juneorders"
COLUMNS="ID, Number,Date"
DELIMITER=","
TEXTQUALIFIER="""">
<CFOUTPUT QUERY="juneorders">
Order ID: #ID#<BR>
Order Number: #Number#<BR>
Order Date: #Date#<BR>
</CFOUTPUT>
使用CFTTP的Post方法
Post方法用于向指定的ColdFusion文件或CGI程序发送Cookie变量,form变量,CGI变量,
URL变量以及文件变量。使用Post方法时,必须对每个要发送的变量使用CFHTTPPARAM标
签。与Get方法不同,Post方法将数据传送给ColdFusion文件或其它可执行文件,该文
件对传送的变量进行处理并有数据返回。
例如,当你建立一个使用Post方法的HTML表单时,你要指定将form数据传递给哪个程序
文件。在CFHTTP中使用Post方法与此相同。
例子:将变量传递给ColdFusion文件
下面的例子向URL属性所指定的文件传递五种类型的变量。该文件返回各变量的值并显
示在浏览器中。这个例子在接受Post数据的文件中用CFFILE标签将文件变量的内容上载
到C:/temp/junk目录下。
注意:文件Posttest.cfm中的CFOUTPUT引用了变量CFHTTP.Filecontent,用于显示
Server.cfm文件的输出。如果不使用CFHTTP.Filecontent变量,浏览器的输出显示将只
限于Posttest.cfm的内容。
例子文件: posttest.cfm
<CFHTTP METHOD="Post"
URL="http://housebeat/cfdocs/server.cfm"
USERNAME="user1"
PASSword="user1pwd">
<CFHTTPPARAM TYPE="Cookie"
VALUE="cookiemonster"
NAME="mycookie6">
<CFHTTPPARAM TYPE="CGI"
VALUE="CGIvar "
NAME="myCGI">
<CFHTTPPARAM TYPE="URL"
VALUE="theurl"
NAME="myurl">
<CFHTTPPARAM TYPE="Formfield"
VALUE="wbfreuh@allaire.com"
NAME="emailaddress">
<CFHTTPPARAM TYPE="File"
NAME="myfile"
FILE="c:/temp/cyberLOGO.gif">
</CFHTTP>
<CFOUTPUT>
#CFHTTP.filecontent#
#CFHTTP.mimetype#
</CFOUTPUT>
例子文件: server.cfm
You have POSTed to me.<BR>
<CFFILE DESTINATION="c:/temp/junk"
NAMECONFLICT="Overwrite"
FILEFIELD="myfile"
ACTION="Upload"
ATTRIBUTES="Normal">
<CFOUTPUT>
The URL variable is: #url.myurl# <BR>
The Cookie variable is: #cookie.mycookie6# <BR>
The CGI variable is: #CGI.myCGI#. <BR>
The Formfield variable is: #form.myformfield#. <BR>
</CFOUTPUT>
例子:CGI程序的返回结果
下面的例子运行一个CGI程序Search.exe,该程序搜索一个站点,返回VALUE属性所指定
的值的命中次数。
<CFHTTP METHOD="Post"
URL="http://www.thatsite.com/search.exe"
RESOLVEURL="Yes">
<CFHTTPPARAM TYPE="Formfield"
NAME="search"
VALUE="hello">
</CFHTTP>
<CFOUTPUT>
#CFHTTP.MimeType#<BR>
Length: #len(cfhttp.filecontent)# <BR>
Content: #HTMLcodeformat(cfhttp.filecontent)#<BR>
</CFOUTPUT>
使用CFFILE
CFFILE标签使你能以几种不同的方式进行服务器端的文件操作:
· 利用HTML表单,从客户端将文件上载到服务器。
· 移动,重命名,复制或删除服务器上的文件。
·
对服务器上的文本文件进行读、写或追加操作。
要设置的属性依赖于ACTION属性的值,例如,如果设定ACTION=“Write”,则需要设置
与写文本文件有关的属性。
注意:在允许用户访问服务器上的文件之前,应考虑安全性以及目录结构等问题。
文件上载
文件上载
实现文件上载需要建立两个文件:
· 一个HTML表单,用于输入文件上载信息。
· 一个包含文件上载代码的cfm文件。
建立用于文件上载的HTML表单
大多数浏览器都支持文件上载。将HTML INPUT标签的类型设为“file”,则浏览器会准
备从客户端读取并传输一个文件给服务器。将ENCTYPE属性设为
“multipart/form-data”,则服务器会知道表单的提交包含了一个上载的文件。
例子:一个用于文件上载的HTML表单
<FORM ACTION="FileUpload.cfm"
ENCTYPE="multipart/form-data"
METHOD="Post">
<PRE>
File Name: <INPUT NAME="FileName"
TYPE="text">
File: <INPUT NAME="FileContents" TYPE="file">
<INPUT TYPE="submit" VALUE="Upload File">
</PRE>
</FORM>
用户可以输入一个文件的路径,或浏览本地的文件系统并选择一个要上载的文件。注意
必须将ENCTYPE属性设置为“multipart/form-data”。
建立一个文件上载的程序文件
提交一个文件后,该文件还没有保存到服务器上。它只是被译码然后与其它的表单数据
一起被传递给ACTION属性所指的程序文件,在该文件中由CFFILE标签对上载的文件进行
解码并保存到服务器上。
例子:上载一个文件
下面例子中的CFFILE标签可以放置在上一例子中所指的“FileUpload.cfm”文件中:
<CFFILE ACTION="UPLOAD"
FILEFIELD="FileContents"
DESTINATION="C:/Web/Uploads/">
如果请求此文件的文件上载表单传递了一个名为keyMemo.doc文件,则该文件在服务器
上被保存为:
C:/web/Uploads/keyMemo.doc
要以另外的文件名保存上载的文件,可以在DESTINATION属性中指定新文件名。在下面
的例子中,文件“keyMemo.doc”被保存为“UploadedFile.doc”:
<CFFILE ACTION="UPLOAD"
FILEFIELD="FileContents"
DESTINATION="C:/Web/Uploads/UploadedFile.doc">
你也可以将这些属性设置为动态参数。例如,你可以根据数据库查询的结果来设定文件
名。
注意:FILEFIELD属性应设定为一个Form字段的名字,而不是Form字段的值,因此不能
将字段名括在#号中。
处理文件名冲突
将一个文件保存到服务器上时,有可能已经有另一个同名的文件存在,在这种情况下,
利用NAMECONFLICT属性,你可以采取多种处理方法。
例子:解决文件名冲突
在下面的例子中,如果文件上载时发生名字冲突,程序会生成一个唯一的文件名,文件
后缀名保持不变:
<CFFILE ACTION="Upload"
FILEFIELD="FileContents"
DESTINATION="C:/Web/Uploads/"
NAMECONFLICT="MAKEUNIQUE">
控制上载文件的类型
对某些应用程序,你也许需要限制上载文件的类型。例如,在一个文档库中,你也许不
想接受图形文件。
ACCEPT属性用于限制允许上载的文件类型。指定了ACCEPT属性后,被上载文件的MIME内
容类型必须与指定的条件相匹配,否则就会产生错误。ACCEPT属性的值是一列由逗号隔
开的MIME数据类型名,其中可以使用通配符。
一个文件的MIME类型决定于浏览器,普通的类型如“image/gif”和“text/plain”等
已在浏览器中注册。
例子:限制文件类型
这个CFFILE 只保存GIF格式的图象文件:
<CFFILE ACTION="Upload"
FILEFIELD="UploadFile"
DESTINATION="c:/uploads/MyImage.GIF"
NAMECONFLICT="OVERWRITE"
ACCEPT="image/gif">
这个CFFILE 只保存GIF格式或JPEG格式的图象文件:
<CFFILE ACTION="Upload"
FILEFIELD="UploadFile"
DESTINATION="c:/uploads/MyImage.GIF"
NAMECONFLICT="OVERWRITE"
ACCEPT="image/gif, image/jpeg">
这个CFFILE只保存图象文件,但对其格式没有限制:
<CFFILE ACTION="Upload"
FILEFIELD="UploadFile"
DESTINATION="c:/uploads/MyImage.GIF"
NAMECONFLICT="OVERWRITE"
ACCEPT="image/*">
注意:如果ACCEPT属性被忽略或设为空或设为“*/*”,则所有类型的文件都可以被上
载。
设置文件和目录的属性
设置文件和目录的属性
在Windows中,用CFFILE的ATTRIBUTES属性定义文件属性;在UNIX中,用CFFILE和
CFDIRECTORYMDE属性定义文件和目录权限。
UNIX
在UNIX中,你可以对文件和目录设置权限。MODE属性的值相对应于UNIX命令chmod的十
进制数值。
· 4=读
· 2=读/写
· 1=读/写/执行
你应按照“所有者,组,其它用户”的顺序,为每种类型的用户设置权限值。例如,为
所有用户设置读权限:
MODE=444
Windows
在Windows中,你可以设置下面的文件属件:
????????· ReadOnly
????????· Temporary
????????· Archive
????????· ?Hidden
????????· ?System
????????· ?Normal
如果不使用ATTRIBUTES属性,则文件现有的属性被保留。如果同时指定了Normal属性和
任何其它属性,则Normal属性被其它属性所覆盖。
例子:设置文件属性
这个例子将上载的文件设为Archive属性:
<CFFILE ACTION=”copy”
SOURCE=”c:/files/upload/keymemo.doc”
DESTINATION=”c:/files/backup/”
ATTRIBUTES=”Archive”>
评价文件上载的结果
评价文件上载的结果
完成文件上载之后,你可以利用文件上载变量获取状态信息。状态信息包括与上载文件
有关的各种数据,如文件名和保存的路径等。
文件上载状态变量的推荐用法是使用CFFILE前缀,例如CFFILE.ClientDirectory。为了
向后兼容,File前缀仍可以使用。在任何可以使用ColdFusion变量的地方都可以使用文
件状态变量。
完成文件上载之后,下表中的各个状态变量即可以被引用:
文件上载变量
参数
描述
AttemptedServerFile
ColdFusion最初用来存储被上载文件的文件名,如myfile.txt。
ClientDirectory
被上载文件在客户系统中的目录位置。
ClientFile
被上载文件在客户系统中的文件名,如myfile.txt。
ClientFileExt
被上载文件在客户系统中的扩展名,不包括句号,如txt(而不是.txt)。
ClientFileName
被上载文件在客户系统中的文件名,不包括后缀名。
ContentSubType
被上载文件的MIME内容子类型,例如对image/gif即为gif。
ContentType
被上载文件的MIME内容类型,例如对image/gif即为image。
DateLastAccessed
被上载文件最后一次被访问的时间。
FileExisted
指明是否(yes或no)相同路径的文件已经存在。
FileSize
被上载文件的大小。
FileWasAppended
指明是否(yes/no)要ColdFusion将被上载文件追加到一个已经存在的文件中。
FileWasOverwritten
指明是否(yes/no)要ColdFusion覆盖一个文件。
FileWasRenamed
指明被上载文件是否(yes/no)因文件名冲突而被重命名。
FileWasSaved
指明ColdFusion是否保存了一个文件。
OldFileSize
在文件上载操作中被覆盖的文件的大小。
ServerDirectory
服务器上实际保存了被上载文件的目录。
ServerFile
实际保存到服务器上的文件名。
ServerFileExt
被上载文件在服务器上的文件后缀名,不包括句号,如txt。
ServerFileName
被上载文件在服务器上的文件名,不包括后缀名。
TimeCreated
被上载文件的创建时间。
TimeLastModified
被上载文件最后一次被修改的日期和时间。
引用这些变量时可以使用File前缀或CFFILE前缀,如#File.FileExisted#。
注意:文件状态变量是只读的。这些变量的值是最近一次CFFILE操作的执行结果,如果
执行了两个CFFILE标签,则第一个标签的执行结果被第二个所覆盖。
移动、重合名、复制和删除服务器端文件
移动、重合名、复制和删除服务器端文件
利用CFFILE,你可以对服务器上的文件进行移动、重命名、复制和删除等文件操作,在
下面的这些例子中,许多属性值均被设置为静态值,但是,CFFILE标签的所有属性的值
均可包含动态参数,这使得CFFILE的功能非常强大。
移动一个文件(ACTION=“MOVE”)
用CFFILE可以将服务器上的文件从一个位置移动到另一个位置。如下例,文件
“KeyMemo.doc”被从C:/files/upload/目录移动到C:/files/memo/目录:
<CFFILE ACTION="MOVE"
SOURCE="c:/files/upload/KeyMemo.doc"
DESTINATION="c:/files/memo/">
重命名一个文件(ACTION=“PENAME”)
用CFFILE可以将服务器上的文件重命名。如下例,文件KeyMemo.doc被重命名为
oldmemo.doc:
<CFFILE ACTION="Rename"
SOURCE="c:/files/memo/KeyMemo.doc"
DESTINATION="c:/files/memo/OldMemo.doc">
复制一个文件(ACTION=”COPY”)
用CFFILE可以将服务器上的文件从一个目录复制到另一个目录。下面的例子将文件
KeyMemo.doc的一个备份保存到C:/files/backup/目录:
<CFFILE ACTION="Copy"
SOURCE="c:/files/upload/KeyMemo.doc"
DESTINATION="c:/files/backup/">
删除一个文件(ACTION=“DELETE”)
用CFFILE可以删除服务器上的文件,下面的例子将指定的文件永久性删除:
<CFFILE ACTION="Delete"
FILE="c:/files/upload/攐ldfile.txt">
读、写和追加一个文本文件
读、写和追加一个文本文件
用CFFILE不仅可以操作服务器上的文件,还可以对文本文件进行读取,创建和修改。这
使你能够:
· 建立日志文件
· 生成静态HTML文档
·
用文本文件存储可以添加到网页中的信息
读文本文件(ACTION=“READ”)
你可以用CFFILE来读取一个已经存在的文本文件。文件被读取到一个动态参数中,你可
以在程序文件的任何位置使用该动态参数。例如,你可以读取一个文本文件,然后将其
内容插入到数据库中,你还可以读取文件然后使用查找和替换函数修改其内容。
下面的例子创建一个变量“Message”,用该变量保存文件“message.txt”的内容:
<CFFILE ACTION="Read"
FILE="C:/Web/message.txt"
VARIABLE="Message">
于是在应用程序文件中即可以使用变量“Message”。例如,你可以在网页中显示文件
message.txt的内容:
<CFOUTPUT>#Message#</CFOUTPUT>
写文本文件(ACTION=“WRITE”)
你可以用CFFILE根据动态内容写一个文本文件。例如,你可以建立一个HTML文件或日志
文件。
下面的例子用用户输入一个HTML插入表单中的信息建立一个文件:
<CFFILE ACTION="Write"
FILE="C:/files/updates/#Form.UpdateTitle#.txt"
OUTPUT="Created By: #Form.FullName#
Date: #Form.Date#
#Form.Content# ">
如果用户输入如下的信息并提交表单:
UpdateTitle="FieldWork"
FullName="John Lunch"
Date="10/1/98"
Content="We had a wonderful time in Cambridgeport."
则ColdFusion会在C:/files/updates/目录下建立一个文件Fieldwork.txt,该文件中包
含如下文本:
Created By: John Lunch
Date: 10/1/98
We had a wonderful time in Cambridgeport.
追加一个文本文件(ACTION=“APPEND”)
用CFFILE可以向一个已经存在的文本文件中追加文本,如日志文件。下面的例子向文件
Fieldwork.txt中追加一个字符串“But
Davis Square was more fun.”:
<CFFILE ACTION="Append"
DESTINATION="C:/files/updates/FieldWork.txt"
OUTPUT="<B>But Davis Square was more
fun.</B>">
执行目录操作
执行目录操作
CFDIRECTORY标签用于返回指定目录的文件信息,并可以对目录进行创建,删除和重命
名等操作。
与CFFILE一样,在ColdFusion Administrator中可以禁止CFDIRECTORY标签。
CFDIRECTORY的各属性如下表所列:
CFDIRECTORY 属性
属性
描述
ACTION
可选。定义要对DIRECTORY属性中指定的目录所执行的操作。合法的输入包括:
· List
· Create
· Delete
· Rename
缺省值为List.
DIRECTORY
要对之执行目录操作的目录名。
NAME
目录列表输出的查询名。ACTION=”List”时要指定此属性,其他操作忽略此属性。
FILTER
用于过滤返回的文件名,如”*.cfm”。ACTION=”List”时可指定此属性,其他操作忽
略此属性。
MODE
可选。只在Solaris中,在ACTION=”Create”时使用,用于设置一个目录的许可权限。
在Windows中将被忽略。
其合法取值对应于UNIX的chmod命令的十进制值。许可权限按照“所有者,组,其它”
的顺序分别设置。例如:
MODE=644
赋予所有者读/写权限,组和其它用户被赋予读权限。
SORT
ACTION=”List”时可选,对其它操作被忽略。可用此属性指定一列字段名,相互间用
逗号隔开,根据这些字段对输出的目录列表进行排序。对每个字段可指定ASC或DESC,
按升序或降序排序。例如:
SORT=”colname
ASC,filename2 DESC,size,datelastmodified”
NEWDIRECTORY
DIRECTORY属性中指定的目录的新目录名。ACTION=”Rename”时要指定此属性,其它操
作忽略该属性。
返回文件信息(ACTION=“LIST”)
当ACTION=“LIST”时,CFDIRECTORY返回五个变量,你可以在CFOUTPUT中引用这些变量:
· Name——目录名或文件名。
· Size——目录大小或文件大小。
· Type——文件类型:F代表文件,D代表目录。
· DateLastModified——最后一次被
修改的时间。
· Attributes——文件属性。
· Mode——(仅Solaris支持)代表指定目录的权限设置的十进制数。
例子
你可以在CFML扩展中使用查询结果字段,只需以查询名作为字段名的前缀。
<CFDIRECTORY
DIRECTORY="c:/winnt/system32"
NAME="mydirectory"
SORT="size ASC, name DESC, datelastmodified">
<CFOUTPUT QUERY=”mydirectory”>
Name: #mydirectory.name# <BR>
Size: #mydirectory.size# <BR>Type: #mydirectory.type# <BR>
Date last modified: #mydirectory.datelastmodified# <BR>
Attributes: #mydirectory.attributes#<BR>
Mode: #mydirectory.mode#<BR>
</CFOUTPUT>
建立连接
CFFTP标签使你能够通过文件传输协议(ftp)与远程服务器相交互。这是服务器与服务
器之间的文件操作。要实现服务器与浏览器之间的文件操作,应使用CFFILE,
CFCONTENT和CFDIRECTORY标签。
建立连接
CFFTP的使用涉及两种类型的操作,建立连接和传输文件。
注意:CFFTP是一个COM对象,Microsoft Windows NT 3.51不支持此对象。
例子:FTP登录
下面的例子演示了一个打开的FTP连接,并提供了用户名和密码。
<CFFTP
CONNECTION=FTP
USERNAME="betauser"
PASSword="monroe"
SERVER="beta.company.com"
ACTION="Open"
STOPONERROR="No">
CFFTP标签要求指定USERNAME和PASSword属性,为此当建立匿名连接时,要以
“anonymous”作为用户名,以一个email地址作为密码。
文件和目录操作
建立连接之后,你就可以与所连接的FTP服务器进行交互,执行文件和目录操作。实现
文件和目录操作的CFFTP标签的各属性如下表所列:
CFFPT文件和目录操作属性
属性
描述
ACTION
如果连接没有被缓冲,则需要此属性,否则不需要。
指明要执行的FTP操作,这些操作可以是下列之一:
· ChangeDir
· CreateDir
· ListDir
· GetFile
· PutFile
· Rename
· Remove
· GetCurrentDir
· GetCurrentURL
· ExistsDir
· ExistsFile
· Exists
注意:文件名和目录名是区分大小写的。例如,对test.log执行ListDir操作不会找到
test.LOG。
USERNAME
用于建立FTP连接的用户名。如果连接已经被缓冲,则不需要此属性。
PASSword
用于建立连接的密码。如果连接已经被缓冲,则不需要此属性。
NAME
当ACTION=”ListDir”时需要此属性,用于指定用来保存目录列表的查询名。
SERVER
要与之建立连接的服务器名。如果连接已经被缓冲,则不需要此属性。
TIMEOUT
可选。用于指定所有操作的超时秒数。缺省值是30秒。
PORT
可选。用于指定远程服务器的端口号。
CONNECTION
可选。指定FTP连接的名字,用于缓冲当前的FTP连接或重用已缓冲的FTP连接。所有使
用相同连接名的CFFTP都使用相同的连接信息。
ASCIIEXTENSIONLIST
可选。一列用分号隔开的文件扩展名,用于在TRANSFERMODE=”Autodetect”时强制进
行ASCII传输模式。缺省的扩展名列表是:
txt;htm;HTML;cfm;cfml;shtm;sHTML;CSS;ASP;asa
TRANSFERMODE
可选。指定你要用的FTP传输模式。合法的输入有ASCII,Binary,或Autodetect。缺省值
是Autodect.
AGENTNAME
可选。管理传输的应用程序。
FAILIFEXISTS
可选。其值为Yes或NO,缺省为Yes。用于指明当同名的文件已经存在时,GetFile操作
是否失败。
DIRECTORY
当ACTION=ChangeDir,CreateDir,ListDir,ExistsDir时需要此属性。用于指定要对之进
行操作的目录。
LOCALFILE
当ACTION=GetFile,PutFile时需要此属性。用于指定用户本地文件系统中的文件名。
REMOTEFILE
当ACTION=GetFile,PutFile,ExistsFile时需要此属性。用于指定FTP服务器上文件系统
中的文件名。
ATTRIBUTES
可选。一列用逗号隔开的文件属性。缺省值为”Normal”。用于在GetFile操作中指定
本地文件的文件属性。其值可以是下列值的任意组合:
· ReadOnly
· Hidden
· System
· Archive
· Directory
· Compressed
· Temporary
· Normal
ITEM
当ACTION=Exists,Remove时需要此属性。用于指定这些操作的对象,文件或目录。
EXISTING
当ACTION=Rename时需要此属性。指定远程服务器上文件或目录的当前名字。
NEW
当ACTION=Rename时需要此属性。指定远程服务器上文件或目录的新名字。
RETRYCOUNT
可选。报错之前的重试次数。缺省值是1。
STOPONERROR
可选。其值为Yes或No,缺省值为NO。当为Yes时,停止所有的处理并显示合适的错误信
息;当为No时,产生三个变量:
· CFFTP.Succeeded---Yes 或NO.
· CFFTP.ErrorCode---错误号。
· CFFTP.ErrorText---解释错误情况的错误信息。
连接缓存
一旦用CFFTP建立了一个连接,你可以再次使用该连接,执行附加的FTP操作。要实现这
一点,在第一次建立连接时要用CONECTION属性定义并命名一个FTP连接对象。此对象用
于保存与连接有关的信息,任何附加的FTP操作只要使用相同的CONECTION名字,即可自
动使用存储在连接对象中的信息。这项特性节省了连接和登录到FTP服务器的时间,从
而提高了文件传输操作的效率。
当你使用一个FTP连接时,你不需要重新指定下列属性:
· USERNAME
· PASSword
· SERVER
在这种情况下,如果使用了框架(frame),则你应确保当多个请求同时到达时,只有
一个框架将使用连接对象。
跨多个文件的连接缓存
CFFTP缓存只能维持在当前的网页中,除非你显式地将一个CFFTP连接分配给一个应用程
序范围或session范围的变量。将一个CFFTP连接分配给一个Application变量对象有可
能会出现问题,因为有可能会有多个用户同时访问同一个连接对象。为CFFTP连接创建
一个Session变量是比较合适的。
将FTP连接名分配给一个session变量即可实现session范围内的连接缓存。如下例所示:
<CFFTP ACTION=connect
USERNAME="anonymous"
PASSword="me@home.com"
SERVER="ftp.eclipse.com"
CONNECTION="Session.myconnection">
在这个例子中,连接缓存在当前Session的所有程序文件中有效。当然,你首先应确保
你的应用程序允许了Session变量。
注意:要修改一个缓存的连接,例如改变RETRYCOUNT或TIMEOUT的值,则必须重新建立
该连接。
连接缓存的操作和属性
下表显示了使用连接缓存进行各种操作所需的CFFTP属性,如果没有使用连接缓存,则
还需指定USERNAME,
PASSword和SERVER属性。
CFFTP各操作所需的属性
操作
属性
操作
属性
Open
无
Rename
EXISTING
NEW
Close
无
Remove
SERVER
ITEM
ChangeDir
DIRECTORY
GetCurrentDir
无
CreateDir
DIRECTORY
GetCurrentURL
无
ListDir
NAME
DIRECTORY
ExistsDir
DIRECTORY
GetFile
LOCALFILE
REMOTEFILE
ExistsFile
REMOTEFILE
PutFile
LOCALFILE
REMOTEFILE
Exists
ITEM
例子:一个FTP Session
下面的例子打开一个FTP连接,获取文件列表,显示文件或目录的名字,路径,URL,长
度,以及修改日期。例中使用了连接缓存,并允许了自动检测错误。
<--- open FTP connection --->
<CFFTP CONNECTION=FTP
USERNAME="betauser"
PASSword="monroe"
SERVER="beta.company.com"
ACTION="Open"
STOPONERROR="Yes">
<--- get current directory name --->
<CFFTP CONNECTION=FTP
ACTION="GetCurrentDir"
STOPONERROR="Yes">
<--- output directory name --->
<CFOUTPUT>
FTP directory listing of #cfftp.returnvalue#.<p>
</CFOUTPUT>
<--- get directory info --->
<CFFTP CONNECTION=FTP
ACTION="listdir"
DIRECTORY="/*."
NAME="q"
STOPONERROR="Yes">
<--- output dir-list results --->
<HR>
<P>FTP Directory Listing:</P>
<CFTABLE QUERY="q" HTMLTABLE>
<CFCOL HEADER="<B>Name</B>"
TEXT="#name#">
<CFCOL HEADER="<B>Path</B>"
TEXT="#path#">
<CFCOL HEADER="<B>URL</B>"
TEXT="#url#">
<CFCOL HEADER="<B>Length</B>"
TEXT="#length#">
<CFCOL HEADER="<B>LastModified</B>"
TEXT="Date(Format#lastmodified#)">
<CFCOL HEADER="<B>IsDirectory</B>"
TEXT="#isdirectory#">
</CFTABLE>
CFFTP变量
CFFTP操作返回下列变量:
·
CFFTPResult.ReturnValue
·
当ACTION属性为“ListDir”时,返回CFFTP查询对象。
·
当STOPONERROR属性值为“NO”时,创建三个变量。
CFFTPResult.ReturnValue
变量CFFTPResult.ReturnValue的值决定于CFFTP的ACTION属性。
CFFTPResult.ReturnValue
CFFTP ACTION
CFFTPResult.ReturnValue变量的值
GetCurrentDir
当前目录的字符串值
GetCurrentURL
当前URL的字符串值
ExistsDir
Yes或No
ExistsFile
Yes或No
Exists
Yes或No
STOPONERROR变量
当STOPONERROR属性被设置为“NO”时,将创建如下的变量:
·
CFFTP.Succeeded——Yes或NO
·
CFFTP.ErrorCode——错误码(参见下面的CFFTP.Errorcode值)
·
CFFTP.ErrorText——解释错误情况的文本信息。
下表列出了CFFTP.ErrorCode变量的可能值:
CFFTP.ErrorCode变量的值
错误码
描述
0
操作成功
1
系统错误
2
无法建立Internet会话
3
无法打开FTP会话
4
无法识别文件传输模式
5
无法建立搜索连接
6
被调用的操作只有在搜索时才合法
7
非法的超时值
8
非法的端口号
9
没有足够的内存
10
本地文件不可读取
11
本地文件不可写入
12
无法打开远程文件
13
无法读取远程文件
14
无法打开本地文件
15
不能写入远程文件
16
未知错误
17
保留
18
文件已经存在
19
保留
20
保留
21
非法的重试次数
CFFTP查询对象的属性
当你使用CFFTP的ListDir操作时,你必须指定NAME属性的值。NAME属性的值用于将
ListDir操作的查询结果保存在一个查询对象中。这个查询对象的各个字段可以用如下
的格式来引用:
queryname Columnname[row]
其中queryname即是在NAME属性中指定的查询名,Columnname是返回到查询对象中
的各字段之一,Row是由ListDir操作所返回的每个文件/目录项的行号,每个文件或子
目录都占用单独的一行。
下表列出了查询对象中的各个字段。
CFFTP查询对象字段
字段
描述
Name
当前元素的文件名
Path
当前元素的文件路径(不包括盘符)
URL
当前元素(文件或目录)的完整URL
Length
当前元素的文件大小
LastModified
当前元素的未格式化的日期/时间
Attributes
当前元素的属性
Isdirectory
布尔值,指明当前元素是文件还是目录
使用CFHTTP与Web相交互
CFHTTP标签是功能最强大的CFML标签之一,它可以用来:
·
从网络上获取网页和查询结果。
· 向远程服务器,CFML模板或CGI应用程序传送数据并处理返回数据。
超文本传输协议(HTTP)处理Web服务器之间的各种通信。执行一个事务处理所采取的
方法决定了服务器处理什么以及什么内容被传送给浏览器。除了HTML文档之外,HTTP还
支持二进制文件,图象、音频和视频等内容类型。HTTP协议标准规定,用户的请求信息
和服务器的响应信息,以及事务处理的状态信息均以请求标题和响应标题的形式被传递。
HTTP协议有几种通信方法,用于在客户和服务器之间交换信息。CFHTTP标签实现了最常
用的HTTP通信方法:GET和POST.
CFHTTP的语法非常简单,但它提供了许多选项,用于指定输出,处理链接以及建立查询
等任务。
CFHTTP的语法
CFHTTP 标签的基本语法如下:
<CFHTTP URL=" hostname"
USERNAME=" username"
PASSword=" password"
NAME=" queryname"
COLUMNS=" query_columns"
PATH=" path"
FILE=" filename"
METHOD=" get_or_post"
DELIMITER=" character"
TEXTQUALIFIER=" character"
RESOLVEURL=" Yes/No"
PROXYSERVER=" hostname">
</CFHTTP>
处理所获网页中的链接
要保持通过CFHTTP从Web服务器获取的网页中的相对链接,应将RESOLVEURL属性设为
“Yes”。当RESOLVEURL=YES时,下列可能包含链接的标签会被处理:
· IMG SRC
· A HREF
· RORM ACTION
· APPLET CODE
· SCRIPT SRC
· EMBED SRC
· EMBED PLUGINSPACE
· BODY BACKGROUND
· FRAME SRC
· BGSOUND SRC
· OBJECT DATA
· OBJECT CLASSID
· OBJECT C0DEBASE
· OBJECT USEMAP
注意:如果获取的网页中某个URL指向一个二进制文件,则该网页不被显示。你可以输
入一个路径作为PATH属性的值,从而把该二进制文件保存到本地计算机中。
使用CFHTTP的Get方法
Get方法于从指定的服务器获取文本文件或二进制文件。下面的几个例子演示了几种常
用的Get操作。Get方法是一种单向的事务处理方法,CFHTTP用这种方法获得一个对象,
而Post方法是双向的处理方法,CFHTTP用Post方法向ColdFusion文件或CGI程序传递变
量,并接收和处理返回的数据。
例子:获取到变量中
下面的例子用Get方法请求Yahoo站点的缺省主页,并将文件内容保存到一个变量中,然
后用CFOUTPUT将该变量的内容显示在浏览器中。
<CFHTTP METHOD="Get"
URL="http://www.yahoo.com/index.htm"
RESOLVEURL="Yes">
<CFOUTPUT>
#CFHTTP.FileContent# <BR>
</CFOUTPUT>
当FILE属性和PATH属性被忽略时,ColdFusion将文件index.htm的内容保存到变量
CFHTTP.FileContent中。要注意的是,若不把RESOLVEURL属性设为“Yes”,则下载的
网页中相对链接会被打断。若将该属性设为“Yes”,则相对链接会被转换为绝对链接。
例子:获取到一个文件中
下面的例子也用Get方法执行一个简单的文件请求,但PATH属性和FILE属性的使用导致
下载的文件被保存到本地的文件中。
<CFHTTP METHOD = "get"
URL="http://www.yahoo.com/index.htm"
PATH="c:/temp"
FILE="yahooindex.htm">
注意,当使用了PATH属性和FILE属性时,RESOLVEURL属性会被忽略(即使指定了该属性,
也将被忽略)。
例子:获取一个二进制文件
与上一个例子相似,这个例子也从服务器下载一个文件并保存到PATH属性和FILE属性所
指定的位置。唯一的不同是被下载文件的MIME类型不一样。
<CFHTTP METHOD="Get"
URL="http://maximus/downloads/quakestuff/q2_test.zip"
PATH="c:/quake2/install"
FILE="quake2beta.zip">
<CFOUTPUT>
#CFHTTP.MimeType#
</CFOUTPUT>
CFOUTPUT代码块显示了被下载文件的MIME类型,在此例中是application/zip。
根据一个文本文件建立查询
使用CFHTTP的Get方法,你可以根据一个有分隔符的文本文件创建查询对象。这是处理
生成的文本文件的一个有力方法。一旦查询对象创建之后,对查询字段的引用和处理是
非常简单的。
文本文件的处理方式如下:
· 用DELIMITER属性指定一个分隔符。如果某个字段的数据包含分隔符本身,则
必须将其括在引号中或括在某个其它字符中,你可以用TEXTQUALIFIER属性指定该字符。
·
缺省情况下,文本文件的第一行被解释为字段标题文本。你可以在COLUMNS属性中指定
替代的标题文本。如果这样,你应确保为文本文件的每一列都指定了替代的标题文本。
·
当遇到重复的字段标题时,ColdFusion为重复的字段名添加一个下划线字符。例如,如
果发现两个字段标题都是CustomerID,则第二个字段标题被更名为“CustomerID_”。
例子:根据一个文本文件创建查询
这个例子根据一个以逗号为分隔符的文本文件创建一个查询对象。该文本文件有六列数
据,互相以逗号分隔,文件的第一行为:
OrderID,OrderNum,OrderDate,ShipDate,ShipName,ShipAddress
这个例子接受文本文件的第一行作为字段名:
<CFHTTP METHOD="Get"
URL="http://127.0.0.1/orders/june/orders.txt"
NAME="juneorders"
DELIMITER=","
TEXTQUALIFIER="""">
<CFOUTPUT QUERY="juneorders">
OrderID: #OrderID#<BR>
Order Number: #OrderNum#<BR>
Order Date: #OrderDate#<BR>
</CFOUTPUT>
你可用COLUMNS属性指定不同与上例的字段名:
<CFHTTP METHOD="Get"
URL="http://127.0.0.1/orders/june/orders.txt"
NAME="juneorders"
COLUMNS="ID, Number,Date"
DELIMITER=","
TEXTQUALIFIER="""">
<CFOUTPUT QUERY="juneorders">
Order ID: #ID#<BR>
Order Number: #Number#<BR>
Order Date: #Date#<BR>
</CFOUTPUT>
使用CFTTP的Post方法
Post方法用于向指定的ColdFusion文件或CGI程序发送Cookie变量,form变量,CGI变量,
URL变量以及文件变量。使用Post方法时,必须对每个要发送的变量使用CFHTTPPARAM标
签。与Get方法不同,Post方法将数据传送给ColdFusion文件或其它可执行文件,该文
件对传送的变量进行处理并有数据返回。
例如,当你建立一个使用Post方法的HTML表单时,你要指定将form数据传递给哪个程序
文件。在CFHTTP中使用Post方法与此相同。
例子:将变量传递给ColdFusion文件
下面的例子向URL属性所指定的文件传递五种类型的变量。该文件返回各变量的值并显
示在浏览器中。这个例子在接受Post数据的文件中用CFFILE标签将文件变量的内容上载
到C:/temp/junk目录下。
注意:文件Posttest.cfm中的CFOUTPUT引用了变量CFHTTP.Filecontent,用于显示
Server.cfm文件的输出。如果不使用CFHTTP.Filecontent变量,浏览器的输出显示将只
限于Posttest.cfm的内容。
例子文件: posttest.cfm
<CFHTTP METHOD="Post"
URL="http://housebeat/cfdocs/server.cfm"
USERNAME="user1"
PASSword="user1pwd">
<CFHTTPPARAM TYPE="Cookie"
VALUE="cookiemonster"
NAME="mycookie6">
<CFHTTPPARAM TYPE="CGI"
VALUE="CGIvar "
NAME="myCGI">
<CFHTTPPARAM TYPE="URL"
VALUE="theurl"
NAME="myurl">
<CFHTTPPARAM TYPE="Formfield"
VALUE="wbfreuh@allaire.com"
NAME="emailaddress">
<CFHTTPPARAM TYPE="File"
NAME="myfile"
FILE="c:/temp/cyberLOGO.gif">
</CFHTTP>
<CFOUTPUT>
#CFHTTP.filecontent#
#CFHTTP.mimetype#
</CFOUTPUT>
例子文件: server.cfm
You have POSTed to me.<BR>
<CFFILE DESTINATION="c:/temp/junk"
NAMECONFLICT="Overwrite"
FILEFIELD="myfile"
ACTION="Upload"
ATTRIBUTES="Normal">
<CFOUTPUT>
The URL variable is: #url.myurl# <BR>
The Cookie variable is: #cookie.mycookie6# <BR>
The CGI variable is: #CGI.myCGI#. <BR>
The Formfield variable is: #form.myformfield#. <BR>
</CFOUTPUT>
例子:CGI程序的返回结果
下面的例子运行一个CGI程序Search.exe,该程序搜索一个站点,返回VALUE属性所指定
的值的命中次数。
<CFHTTP METHOD="Post"
URL="http://www.thatsite.com/search.exe"
RESOLVEURL="Yes">
<CFHTTPPARAM TYPE="Formfield"
NAME="search"
VALUE="hello">
</CFHTTP>
<CFOUTPUT>
#CFHTTP.MimeType#<BR>
Length: #len(cfhttp.filecontent)# <BR>
Content: #HTMLcodeformat(cfhttp.filecontent)#<BR>
</CFOUTPUT>