ftp
任务实现了一个基本的 FTP 客户端,可以发送、接收、列出、删除文件以及创建目录。请参见以下内容,了解如何执行每个任务的描述和示例。
注意:此任务依赖于 Apache Ant 分发版中未包含的外部库。有关更多信息,请参见 库依赖项。获取此库的最新版本,以获得 Ant 中的最佳支持。
ftp
任务尝试确定 FTP 服务器上存在的文件系统。支持的服务器类型包括 Unix、NT、OS2、VMS 和 OS400。此外,已配置为以 Unix 样式显示目录的 NT 和 OS400 服务器也得到正确支持。否则,系统将默认使用 Unix 标准。remotedir
必须以 FTP 服务器所需的精确语法指定。如果服务器不支持通常的 Unix 约定,则可以使用 separator
来设置应使用的文件分隔符。
有关如何包含/排除文件以及如何编写模式的信息,请参见有关 基于目录的任务 的部分。
此任务当前不使用由 <setproxy>
任务设置的代理信息,并且无法通过 socks 穿越防火墙。
警告:据报道,ftp
的 get
操作与 newer
属性存在问题。问题可能是由于 ls -l
的格式与 commons-net 预期格式不同,例如,由于 FTP 服务器在目录列表中使用的语言的具体情况。如果您遇到此类问题,请发送一封电子邮件,其中包含来自 FTP 服务器的示例目录列表(在 FTP 提示符下使用 ls -l
)。
如果您能够连接但无法上传或下载,请尝试将 passive
属性设置为 true
,以使用现有(打开)通道,而不是让服务器尝试建立新的连接。
属性 | 描述 | 必需 |
---|---|---|
server | 远程 FTP 服务器的地址。 | 是 |
port | 远程 FTP 服务器的端口号。 | 否;默认值为 21 |
userid | 在 FTP 服务器上使用的登录 ID。 | 是 |
password | 在 FTP 服务器上使用的登录密码。 | 是 |
account | 在 FTP 服务器上使用的帐户。自 Ant 1.7 起。 | 否 |
remotedir | FTP 服务器上的远程目录,请参见下表以了解详细用法 | 否 |
action | 要执行的 FTP 操作。当前支持 put 、get 、del 、list 、chmod 、mkdir 、rmdir 和 site 。 |
否;默认值为 send |
binary | 选择二进制模式 (yes ) 或文本模式 (no ) 传输。 |
否;默认值为 yes |
passive | 选择被动模式 (yes ) 传输,以实现更好的防火墙连接,但性能会降低。 |
否;默认值为 no |
verbose | 如果设置为 yes ,则显示每个传输文件的详细信息。 |
否;默认值为 no |
depends | 如果设置为 yes ,则仅传输新文件或已更改文件。 |
否;默认值为 no |
newer | depends 的同义词。请参见 timediffauto 和 timediffmillis |
否 |
timediffauto | 设置为 true 以使 Ant 计算客户端和服务器之间的时间差。需要远程目录中的写入权限 自 Ant 1.6 起 如果设置为 true ,则 Ant 将在 临时目录 中创建一个空文件,并将其传输到远程服务器 - 在确定时间差后,将删除两侧的文件。 |
否 |
timestampGranularity | 指定 MINUTE 或 NONE (您可以指定 ,这等效于未指定值,对于属性文件驱动的脚本很有用)。允许覆盖 put 和 get 中的典型情况,其中本地文件系统的 timestamps 为 HH:mm:ss ,而典型 FTP 服务器的 timestamps 为 HH:mm 。这可能会影响 uptodate 计算。但是,默认值应该足以满足大多数应用程序。自 Ant 1.7 起 |
否;仅适用于 put (默认值为 MINUTE )和 get (默认值为 NONE ;没有必要,因为我们有 preservelastmodified 选项) |
timediffmillis | 已弃用。要添加到远程计算机上的时间以获得本地计算机上的时间的时间(以毫秒为单位)。timestampGranularity 属性(其默认值应该足以满足大多数情况)和 serverTimeZoneConfig 选项应该使此操作变得不必要。serverTimeZoneConfig 会为您执行数学运算,并且还了解夏令时。自 Ant 1.6 起 |
否 |
separator | 设置 FTP 服务器上使用的文件分隔符。 | 否;默认值为 / |
umask | 设置新文件的默认文件权限,仅限 Unix。 | 否 |
chmod | 设置或更改新文件或现有文件的权限,仅限 Unix。如果与 put 操作一起使用,则将针对每个文件发出 chmod 。 |
否 |
listing | 用于写入 list 操作结果的文件。 |
是,对于 list 操作;否则忽略 |
ignoreNoncriticalErrors | 标志,允许任务忽略某些服务器在创建目录期间发送的非致命错误代码:特别是 wu-ftp。 | 否;默认值为 false |
skipFailedTransfers | 标志,允许跳过不成功的文件 put 、delete 和 get 操作,并显示警告,同时仍然传输其余文件。 |
否;默认值为 false |
preservelastmodified | 使复制的文件具有与原始源文件相同的最后修改时间(仅适用于获取文件)。 | 否;默认值为 false |
retriesAllowed | 设置文件传输操作允许的重试次数。如果指定了正数,则每个文件传输最多可以失败该次数,然后操作才会失败。如果指定了 -1 或 forever ,则操作将一直尝试,直到成功。 |
否;默认值为 0 |
siteCommand | 如果 action 属性已指定为 site ,则设置要执行的特定于服务器的 SITE 命令。 | 否 |
initialSiteCommand | 设置登录后立即执行的特定于服务器的 SITE 命令。 |
否 |
enableRemoteVerification | 数据连接是否应验证以连接到与控制连接相同的主机。这是一种默认情况下启用的安全措施,但在某些防火墙场景中禁用它可能很有用。自 Ant 1.8.0 起 | 否;默认值为 true |
dataTimeout | 设置在等待数据连接上的数据时使用的超时时间(以毫秒为单位)。值为 0 表示无限超时。自 Ant 1.10.7 起 | 否 |
wakeUpTransferInterval | 仅在证明必要时使用,以秒为单位的间隔,在此间隔内触发 LIST 命令以触发数据连接(以避免 FTP 服务器在没有数据连接的情况下超时)。自 Ant 1.10.7 起 | 否 |
以下属性需要 jakarta-commons-net-1.4.0 或更高版本。 当标准选项不起作用时,请使用这些选项,因为
如果没有指定这些选项,则将使用默认机制,即让系统根据 FTP 为了帮助进行基于属性文件的开发,其中构建脚本使用属性文件配置,对于任何这些属性,值为 请了解,这些选项与自动检测方案不兼容。如果指定了任何这些选项(除了值为 |
||
systemTypeKey | 指定服务器上使用的系统类型。支持的值为 UNIX 、VMS 、WINDOWS 、OS/2 、OS/400 、MVS 。如果未指定(或指定为 ),并且未指定其他 xxxConfig 属性,则将使用基于 FTP SYST 命令的自动检测机制。自 Ant 1.7 起 |
否,但如果指定了以下任何 xxxConfig 属性,则将假设为 UNIX,即使在此处指定了 。 |
serverTimeZoneConfig | 以 Java TimeZone 标识符(例如 GMT 、America/Chicago 或 Asia/Jakarta )指定服务器用于 timestamps 的时区。这使得即使服务器与客户端位于不同的时区,也能进行时间戳依赖项检查。时区还了解夏令时,并且不需要您计算毫秒差。如果未指定(或指定为 ),则假设为客户端的时区。自 Ant 1.7 起 |
否 |
defaultDateFormatConfig | 以 Java SimpleDateFormat 符号(例如 yyyy-MM-dd )指定 FTP 服务器通常用于解析日期的日期格式。在某些情况下,这将是唯一使用的日期格式。在其他情况下(例如 unix ),这将用于超过一年的日期。(请参见 recentDateFormatConfig )。当指定为 时,将使用默认值。自 Ant 1.7 起 |
否;默认值为由 systemTypeKey 指示的系统类型的默认日期格式 |
recentDateFormatConfig | 以 Java SimpleDateFormat 符号(例如 MMM dd hh:mm )指定 FTP 服务器用于解析不到一年的日期的日期格式。如果未指定(或指定为 ),并且由 systemTypeKey 指示的系统类型使用最近的日期格式,则将使用其标准格式。自 Ant 1.7 起 |
否 |
serverLanguageCodeConfig | 用于指定服务器用于格式化月份名称的语言的 两位字母的 ISO-639 语言代码。仅当服务器在其日期列表中使用非数字月份缩写,并且语言不是英语时,才需要指定此选项。这似乎越来越少见,因为普遍分发的 FTP 服务器似乎越来越多地使用英语或全数字格式。支持的语言包括
shortMonthNamesConfig 属性。自 Ant 1.7 起 |
否 |
shortMonthNamesConfig | 指定服务器在文件时间戳日期中使用的月份缩写,以每个月的管道分隔字符串形式表示。例如,假设冰岛 FTP 服务器使用的月份名称集可以指定为 jan|feb|mar|apr|maí|jún|júl|ágú|sep|okt|nóv|des。此属性主要用于支持 serverLanguageCode 属性不支持的语言。 自 Ant 1.7 起 |
否 |
useFtps | 是否使用 ftps 而不是 ftp。布尔值,默认为 false。 自 Ant 1.10.13 起 |
否 |
操作 | remotedir 的含义 | 嵌套 fileset 的使用 |
---|---|---|
send/ put |
发送文件的基目录 | 它们正常使用并在本地机器上进行评估 |
recv/ get |
检索文件的基目录 | 位于 remotedir 下的远程文件,与 fileset 的包含/排除模式匹配 |
del/ delete |
删除文件的基目录 | 位于 remotedir 下的远程文件,与 fileset 的包含/排除模式匹配 |
list |
列出文件的基目录 | 位于 remotedir 下的远程文件,与 fileset 的包含/排除模式匹配 |
mkdir |
要创建的目录 | 未使用 |
chmod |
更改文件模式的基目录 | 位于 remotedir 下的远程文件,与 fileset 的包含/排除模式匹配 |
rmdir |
删除目录的基目录 | 位于 remotedir 下的远程目录,与 fileset 的包含/排除模式匹配 |
ftp
任务支持任意数量的嵌套 <fileset>
元素,以指定要检索、删除、列出或更改其模式的文件。
fileset
的属性 followsymlinks 在本地 (put
) 和远程 (get
、chmod
、delete
、list
) 文件集中都受支持。在 Ant 1.6 之前,远程文件集不支持符号链接。为了排除符号链接(保留 Ant 1.5.x 及更早版本的行为),您需要显式地将 followsymlinks 设置为 false
。在远程文件集中,不会检查隐藏文件是否为符号链接。目前假设隐藏文件不是符号链接。
描述如何发送文件的最佳方法是使用几个示例。
以 anonymous 用户身份登录 ftp.apache.org,并将 htdocs/manual 目录中的所有文件上传到该用户的默认目录。
<ftp server="ftp.apache.org" userid="anonymous" password="[email protected]"> <fileset dir="htdocs/manual"/> </ftp>
以 anonymous 用户身份登录 ftp.apache.org,并将 htdocs/manual 目录中所有新文件或已更改文件上传到相对于 anonymous 用户默认目录的 incoming 目录。
<ftp server="ftp.apache.org" remotedir="incoming" userid="anonymous" password="[email protected]" depends="yes"> <fileset dir="htdocs/manual"/> </ftp>
以 coder 用户身份登录 ftp.apache.org,端口为 2121,密码为 java1,并将 htdocs/manual 目录中所有新文件或已更改的 HTML 文件上传到 /pub/incoming 目录。文件以文本模式传输。已启用被动模式以从防火墙后发送文件。
<ftp server="ftp.apache.org" port="2121" remotedir="/pub/incoming" userid="coder" password="java1" passive="yes" depends="yes" binary="no"> <fileset dir="htdocs/manual"> <include name="**/*.html"/> </fileset> </ftp>
以 coder 用户身份登录位于 ftp.hypothetical.india.org 的 Windows 服务器,端口为 2121,密码为 java1,并将 htdocs/manual 目录中所有新文件或已更改的(考虑时区差异)HTML 文件上传到 /pub/incoming 目录。文件以文本模式传输。
<ftp server="ftp.hypothetical.india.org" port="2121" remotedir="/pub/incoming" userid="coder" password="java1" depends="yes" binary="no" systemTypeKey="Windows" serverTimeZoneConfig="India/Calcutta"> <fileset dir="htdocs/manual"> <include name="**/*.html"/> </fileset> </ftp>
以 coder 用户身份登录基于 Windows 的 ftp.nt.org,密码为 java1,并将 htdocs/manual 目录中所有 HTML 文件上传到 c:\uploads 目录。上传每个文件时都会显示进度消息。
<ftp server="ftp.nt.org" remotedir="c:\uploads" userid="coder" password="java1" separator="\" verbose="yes"> <fileset dir="htdocs/manual"> <include name="**/*.html"/> </fileset> </ftp>
从 FTP 服务器获取文件的工作方式与发送文件非常相似。唯一的区别是嵌套的文件集使用 remotedir 属性作为 FTP 服务器上文件的基目录,使用 dir 属性作为放置文件的本地目录。FTP 站点上的文件结构将保留在本地机器上。
以 anonymous 用户身份登录 ftp.apache.org,并递归地将该用户默认目录中的所有 .html 文件下载到本地机器上的 htdocs/manual 目录。
<ftp action="get" server="ftp.apache.org" userid="anonymous" password="[email protected]"> <fileset dir="htdocs/manual"> <include name="**/*.html"/> </fileset> </ftp>
如果 apache.org 曾经切换到使用新的全数字格式的时间戳的 Unix FTP 服务器,则此版本将变得必要。它将完成与前一个示例相同的功能,但能够成功处理数字时间戳。这里不需要 systemTypeKey,但它有助于澄清正在发生的事情。
<ftp action="get" server="ftp.apache.org" userid="anonymous" password="[email protected]" systemTypeKey="UNIX" defaultDateFormatConfig="yyyy-MM-dd HH:mm"> <fileset dir="htdocs/manual"> <include name="**/*.html"/> </fileset> </ftp>
以 anonymous 用户身份登录位于 ftp.hypothetical.fr 的 UNIX FTP 服务器,该服务器以标准欧洲格式使用法语名称显示日期,并递归地将该用户默认目录中的所有 .html 文件下载到本地机器上的 htdocs/manual 目录。
<ftp action="get" server="ftp.hypthetical.fr" userid="anonymous" password="[email protected]" defaultDateFormatConfig="d MMM yyyy" recentDateFormatConfig="d MMM HH:mm" serverLanguageCodeConfig="fr"> <fileset dir="htdocs/manual"> <include name="**/*.html"/> </fileset> </ftp>
您可能已经猜到,您可以使用嵌套的文件集元素来选择要从远程 FTP 服务器中删除的文件。同样,文件集相对于远程目录,而不是本地目录。实际上,文件集的 dir 属性将完全被忽略。
以 anonymous 用户身份登录 ftp.apache.org,并尝试从该用户的默认目录中删除所有 *.tmp 文件。如果您没有删除文件的权限,则会抛出 BuildException
。
<ftp action="del" server="ftp.apache.org" userid="anonymous" password="[email protected]"> <fileset> <include name="**/*.tmp"/> </fileset> </ftp>
在 data/ftp.listing 中获取 FTP 服务器上相对于 anonymous 用户默认目录的所有文件的列表。列表以 FTP 服务器通常列出文件的任何格式显示。
<ftp action="list" server="ftp.apache.org" userid="anonymous" password="[email protected]" listing="data/ftp.listing"> <fileset> <include name="**"/> </fileset> </ftp>
请注意,使用 mkdir
操作时,要创建的目录是使用 remotedir 属性指定的。
在默认根目录下创建目录 some/remote/dir。与所有其他操作一样,目录分隔符字符必须根据 FTP 服务器的要求正确设置。
<ftp action="mkdir" server="ftp.apache.org" userid="anonymous" password="[email protected]" remotedir="some/remote/dir"/>
此操作使用嵌套的文件集元素来选择要从远程 FTP 服务器中删除的目录。文件集相对于远程目录,而不是本地目录。文件集的 dir 属性将完全被忽略。要删除的目录必须为空,或者仅包含其他也已通过文件集模式选择要删除的目录,否则将抛出 BuildException
。此外,如果您没有删除目录的权限,则会抛出 BuildException
。
以 anonymous 用户身份登录 ftp.apache.org,并尝试删除 /somedir/dira 目录和从 /somedir/dirb 开始并包括该目录的所有目录树。删除 /somedir/dirb 树时,任务从叶子开始向上移动到根,因此当它尝试删除目录时,它可以确保该目录下的所有目录都已删除。显然,树中的所有文件都必须已删除。
<ftp action="rmdir" server="ftp.apache.org" userid="anonymous" password="[email protected]" remotedir="/somedir" > <fileset> <include name="dira"/> <include name="dirb/**"/> </fileset> </ftp>
例如,假设您要删除 /somedir 中的所有内容,因此首先使用 action=delete
调用 <ftp>
任务,然后使用 action=rmdir
调用该任务,在两种情况下都指定 remotedir=/somedir
,并且
<fileset> <include name="**"/> </fileset>
remotedir 参数中指定的目录永远不会被选中以进行删除,因此如果您需要删除它,请在 remotedir 参数中指定其父目录,并在 <fileset>
模式中包含它,例如 somedir/**。