分类: LINUX
2010-02-26 10:00:23
Amazon::S3 模块是 Net::Amazon::S3 的替换。我必须修改 new() 调用以运用散列引用,不过这也是独一须要修改的地点(很清楚,还要将所有 Net::Amazon::S3 引用修改为 Amazon::S3)。
清单 6. 从 net-amazon-s3.pl 修改而来的 amazon-s3.pl
my
$s3
=
Amazon::S3->new({
aws_access_key_id
=>
$opts{key},
aws_secret_access_key
=>
$opts{secret},
retry
=>
1,
});
Amazon::S3 支撑许多选项;请参考文档看看能不能能够运用它们。通常而言,Amazon::S3 的目标好像与 Net::Amazon::S3 稍有不一样,但是从开发人员的角度看,它们的 API 是相似的。这对库的互操作性特别有益。
您可能很赏析 Amazon::S3 的一个特征,即它不像 Net::Amazon::S3 那样依靠许多模块。他的开发者还强调它是可移植的,这对须要它的人而言是件好事。
SOAP::Amazon::S3
探索 File::Slurp
File::Slurp 模块提供的代替项准许您仅运用一个基本的调用来读或写整个文件。它们的目标是基本易用,以及能够灵活地传入或获取文件内容。除了 . 和 .. 之外,还有一个代替项能够读取一个目录下的所有文件。这些代替项适用于文件、管道、套接字、stdio、伪文件和 DATA。
学习 SOAP::Amazon::S3 模块须要明白一些背景知识,我将针对本文稍作推选 。SOAP 是议决 HTTP(Web)访问信息的一种方式,它与运用路径示意资源的多见 HTTP 请求不一样。这些请求通常被称为是 REST 式的,并且趋向于成长成许多 URL 变体;相反,SOAP 仅命中一小部分 URL,并且将所有 XML 传递给服务器。
我很期盼能够继续谈 SOAP,但这是一个特别广泛的主题,因此我把它留给读者去探索。对于其价值,SOAP 和 REST 的差别并不是很大。您运用哪种要领都能够编写出精彩或糟糕的代码。
不幸的是,SOAP::Amazon::S3 在文档中被标记为处于试验阶段。您应该亲自测试它,看看能不能适合您。
谈论区别。最先,咱们须要 File::Slurp 模块,因为 SOAP::Amazon::S3 不能 像 Net::Amazon::S3 和 Amazon::S3 那样提供上传和下载文件的便利要领。
清单 7. soap-amazon-s3.pl 准备
#
set
Debug
to
0
if
you
don't
want
to
see
all
the
XML
my
$s3
=
SOAP::Amazon::S3->new(
$opts{key},
$opts{secret},
{
Debug
=>
1,
RaiseError
=>
1
}
);
我忽略了 Debug=1,因为您将怀着好奇心查看 SOAP::Amazon::S3 生成的所有 SOAP 流量。由于 RaiseError=1,所以我对 Net::Amazon::S3 执行 的所有错误检验都是不必要的,但这在生产环境中不是好主意。
建立 bucket (my $bucket = $s3->createbucket($opts{create});) 与运用 Net::Amazon::S3 建立 bucket 不一样,因为它删除一个 bucket ($bucket->delete()) 或一个对象 ($bucket->object($key)->delete();)。
将数据写到一个文件稍微庞杂些,因为如前所述,SOAP::Amazon::S3 不具备 Net::Amazon::S3 中的便利函数。
清单 8. soap-amazon-s3.pl 写文件
open W, '>', $where or die "Could not write to $where: $!";
print W $bucket->object($key)->getdata();
close W;
从文件上传也一样要庞杂些。
清单 9. soap-amazon-s3.pl 上传文件
my $type = ''.$mime->mimeTypeOf($where); # force $type to be a string
# use File::Slurp::read_file in scalar context to grab the whole file's contents
my $data = read_file($where);
$bucket->putobject($key, $data, { 'Content-Type' => $type });
MIME 类型必须装在一个字符串中,否则将影响 XML 帮助函数模块。此外,内容类型的大写化也与 Net::Amazon::S3 不一样。
结尾,咱们探讨列出项。在这里,SOAP::Amazon::S3 不像 Net::Amazon::S3 那样强悍,因为对象元数据不能用。SOAP::Amazon::S3 有一个精彩的 $object->url() 要领,但它没有将空间转换成 %20,因此您要试用它,看看能不能适合您。我提交了一个 bug(记得,这仍旧一个实验模型),但是现在我避开了生产环境中的 $object->url() 要领。
清单 10. soap-amazon-s3.pl 列出 bucket 和其中的对象
...
elsif
(exists
$opts{list})
{
print
"Available
buckets:\n";
my
@todo;
if
($opts{list})
{
push
@todo,
map
{
$s3->bucket($_)
}
$opts{list};
}
else
{
print
"(Getting
all
buckets)\n";
@todo
=
$s3->listbuckets;
}
foreach
my
$bucket
(
@todo
)
{
printf
"\t%s\n",
$bucket->name;
if
(exists
$opts{keys})
{
foreach
my
$key
($bucket->list())
{
printf
"\t\t%10s\t%-30s\t%s\n",
$key->{Size},
$key->name,
$key->url;
if
(exists
$opts{metadata})
{
foreach
my
$entry
(qw/Size
ETag
LastModified/)
{
printf
"\t\t\t%20s=%s\n",
$entry,
($key->{$entry}'UNDEFINED');
}
}
}
}
}
}
如您所见,SOAP::Amazon::S3 没有获取元数据,因此您不能 看到对象的内容类型等。假如您运用元数据来储存关于对象的主要信息时,这是一个令人不愉快的限定。假如不存在该限定的话,SOAP::Amazon::S3 在列出 bucket 及其元素方面能够与 Net::Amazon::S3 媲美。
结束语
我没有细致评估另外两个 S3 CPAN 模块,而是在这里简要概括一下:
假如您想要议决命令行访问 S3,Net::Amazon::S3::Tools 是不错的挑选。这比自身编写好,因此您能够运用现成的工具测试它。
假如仅处理单个 bucket,Tie::Amazon::S3 是不错的模块。您能够删除或修改散列条目和添加新的条目等等。不幸的是,它不准许 bucket 级别的操作(建立 bucket 和删除 bucket 等)或元数据操作(尤其是在新的密匙上配置内容类型)。因此,假如您想要在 S3 中储存纯数据,Tie::Amazon::S3 是特别有用的,但它对映像的用途不大。
总体而言,Net::Amazon::S3 和 Amazon::S3 当前是处理 S3 的最好挑选。它们的互操作性 API 能够在必要时执行 切换。它们支撑所有操作,上至 bucket 操作,下至元数据获取。它们的 API 有些奇怪,但在配置之后很基本 运用。
重视一下 SOAP::Amazon::S3,它很有潜力。假如您在单个 bucket 中处理纯数据,那么最好运用 Tie::Amazon::S3,因为它能够提供许多方便。
祝您运用 S3 愉快!