File::Fetch - 通用文件获取机制
use File::Fetch;
### build a File::Fetch object ###
my $ff = File::Fetch->new(uri => 'http://some.where.com/dir/a.txt');
### fetch the uri to cwd() ###
my $where = $ff->fetch() or die $ff->error;
### fetch the uri to /tmp ###
my $where = $ff->fetch( to => '/tmp' );
### parsed bits from the uri ###
$ff->uri;
$ff->scheme;
$ff->host;
$ff->path;
$ff->file;
File::Fetch 是一个通用的文件获取机制。
它允许您通过多种方式获取指向 ftp
、http
、file
、git
或 rsync
uri 的任何文件。
有关详细信息,请参阅下面“工作原理”部分。
一个 File::Fetch
对象具有以下访问器
您传递给构造函数的 uri
uri 中的方案(如 'file'、'http' 等)
uri 中的主机名。如果主机最初是 'localhost' 用于 'file://' url,则为空。
在具有卷概念的操作系统上,file:// 的第二个元素被认为是文件的卷规范。因此,在 Win32 上,此例程返回卷,在其他操作系统上,此例程不返回任何内容。
在 Windows 上,如果 uri 指向网络共享,则此值可能为空,在这种情况下,将定义 'share' 属性。此外,使用 '|' 作为 ':' 的卷规范将在读取时转换为使用 ':'。
在具有卷概念的 VMS 上,此字段将为空,因为 VMS 文件规范将转换为绝对 UNIX 格式,并且卷信息将透明地包含在内。
在具有网络共享概念的系统上(目前仅限 Windows)从 file://// url 返回共享名。在其他操作系统上返回空。
uri 中的路径,至少为单个 '/'。
远程文件的名称。对于本地文件名,将使用 $ff->output_file 的结果。
如果 $ff->output_file 无法返回文件名,则会回退到此默认本地文件名。例如,当获取类似 http://www.abc.net.au/ 的 URI 时,检索到的内容可能来自名为 'index.html' 的远程文件。此属性的默认值为 'file_default'。
输出文件的名称。这与 $ff->file 相同,但会去除所有查询参数。例如
http://example.com/index.html?x=y
将使输出文件为 index.html
而不是 index.html?x=y
。
解析 uri 并创建一个相应的 File::Fetch::Item 对象,该对象已准备好进行 fetch
操作并返回它。
失败时返回 false。
获取您请求的文件并返回文件的完整路径。
默认情况下,它写入 cwd()
,但您可以通过指定 to
参数来覆盖它。
### file fetch to /tmp, full path to the file in $where
$where = $ff->fetch( to => '/tmp' );
### file slurped into $scalar, full path to the file in $where
### file is downloaded to a temp directory and cleaned up at exit time
$where = $ff->fetch( to => \$scalar );
成功时返回下载文件的完整路径,失败时返回 false。
返回最后遇到的错误作为字符串。传递一个真值以获取 Carp::longmess()
输出。
File::Fetch 可以通过使用多个外部程序和模块来获取各种 uri。
以下是针对哪些方案将按什么顺序使用哪些实用程序的映射,如果可用。
file => LWP, lftp, file
http => LWP, HTTP::Tiny, wget, curl, lftp, fetch, HTTP::Lite, lynx, iosock
ftp => LWP, Net::FTP, wget, curl, lftp, fetch, ncftp, ftp
rsync => rsync
git => git
如果您想禁用一个或多个这些实用程序和/或模块的使用,请参阅下面的 $BLACKLIST
变量。
如果实用程序或模块不可用,它将在缓存中标记(参见下面的 $METHOD_FAIL
变量),因此不会再次尝试。fetch
方法只有在所有选项都用尽并且无法检索文件时才会失败。
fetch
实用程序在 FreeBSD 上可用。NetBSD 和 Dragonfly BSD 也可能从 pkgsrc
获得它。我们只在这三个平台上检查 fetch
。
iosock
是一种非常有限的基于 IO::Socket::INET 的机制,用于检索 http
协议的 URL。例如,它不支持重定向。
git
只支持 git://
样式的 URL。
关于从 ftp URI 获取文件的特别说明
默认情况下,所有 ftp 连接都使用被动模式。要更改此设置,请参阅下面介绍的 $FTP_PASSIVE
变量。
此外,ftp URI 只支持匿名连接,因此无法传递任何命名用户/密码对。
/bin/ftp
默认情况下被列入黑名单;请参阅下面介绍的 $BLACKLIST
变量。
可以通过更改以下全局变量来改变 File::Fetch 的行为
这是将作为您的匿名 ftp 密码发送的电子邮件地址。
默认值为 [email protected]
。
这是 LWP
将报告的用户代理。
默认值为 File::Fetch/$VERSION
。
此变量控制是否将环境变量 FTP_PASSIVE
和命令行工具的任何被动开关设置为 true。
默认值为 1。
注意:当 $FTP_PASSIVE 为 true 时,ncftp
将不会用于获取文件,因为被动模式只能为该二进制文件交互式设置。
设置后,控制网络超时(以秒为单位)。
默认值为 0。
此变量控制是否应该 carp
File::Fetch
内部遇到的错误。
设置为 false 以静默警告。手动检查 error()
方法的输出以查看发生了什么错误。
默认为 true
。
这在调用命令行实用程序来获取文件时启用调试输出。这也启用 Carp::longmess
错误,而不是常规的 carp
错误。
有助于跟踪为什么某些操作在您的特定设置中不起作用。
默认值为 0。
这是一个数组引用,包含用于获取文件的黑名单模块/实用程序。
例如,要禁止使用 LWP
和 Net::FTP
,可以将 $File::Fetch::BLACKLIST 设置为
$File::Fetch::BLACKLIST = [qw|lwp netftp|]
默认黑名单是 [qw|ftp|],因为 /bin/ftp
非常不可靠。
请参阅下方关于MAPPING
的说明。
这是一个哈希引用,记录了哪些模块/工具在获取文件时已知会失败(主要是因为它们未安装)。
您可以通过将空哈希引用分配给它来重置此缓存,或单独删除键。
请参阅下方关于MAPPING
的说明。
以下是对工具/模块及其在 $BLACKLIST、$METHOD_FAIL 和其他内部函数中的名称的简要映射。
LWP => lwp
HTTP::Lite => httplite
HTTP::Tiny => httptiny
Net::FTP => netftp
wget => wget
lynx => lynx
ncftp => ncftp
ftp => ftp
curl => curl
rsync => rsync
lftp => lftp
fetch => fetch
IO::Socket => iosock
File::Fetch
目前仅支持使用 LWP::UserAgent 的代理。您需要相应地设置环境变量。例如,要使用 ftp 代理
$ENV{ftp_proxy} = 'foo.com';
有关更多详细信息,请参阅 LWP::UserAgent 手册页。
lynx
只能通过将其内容转储到 STDOUT
来获取远程文件,我们反过来捕获它。如果该内容是“自定义”错误文件(例如,404 处理程序
),您将获得该内容。
遗憾的是,lynx
不支持任何选项在非200 OK
状态下返回不同的退出代码,这使我们无法区分“成功”获取和自定义错误页面。
因此,我们建议仅将lynx
作为最后的手段。这就是为什么它在我们尝试的方法列表的最后面。
File::Fetch
相对智能。在尝试将文件写入磁盘时,它会在创建文件之前从文件名中删除查询参数
(有关详细信息,请参阅output_file
方法)。在大多数情况下,这已经足够了。
如果您需要转义其他字符,请从 CPAN 安装 URI::Escape
模块,并在将 URI 传递给 File::Fetch
之前对其进行预编码。您可以在此处了解有关 URI 和 URI 编码的详细信息
https://datatracker.ietf.org/doc/html/rfc2396
指示使用命令行工具而不是模块
请将错误或其他问题报告给 <[email protected]<gt>。
此模块由 Jos Boumans <[email protected]> 编写。
此库是免费软件;您可以在与 Perl 本身相同的条款下重新分发和/或修改它。