【问题标题】:How to upload a binary file with Amazon::S3 in Perl?如何在 Perl 中使用 Amazon::S3 上传二进制文件?
【发布时间】:2012-12-05 14:42:08
【问题描述】:

我找不到任何关于如何使用 Perl 中的 Amazon::S3 库将二进制文件上传到 Amazon S3 的示例。所有示例都被复制/粘贴,只是进行文本/纯文本上传,就好像所有内容都只是纯文本一样。

这是来自http://metacpan.org/pod/Amazon::S3 的示例:

my $keyname = 'testing.txt';
my $value   = 'T';
$bucket->add_key(
    $keyname, $value,
    {   content_type        => 'text/plain',
        'x-amz-meta-colour' => 'orange',
    }
);

这会在 Amazon S3 中创建一个纯文本文件“testing.txt”,内容为“T”。而网上所有的例子都只是复制了这个例子,修改了值“T”。我找不到上传二进制数据的单个示例。

如何将包含二进制内容的图像/jpeg 上传到 Amazon S3?

【问题讨论】:

标签: perl amazon-s3


【解决方案1】:

此 perl 将 jpeg 文件上传到 S3,将其置于减少冗余存储中,将其公开,并设置其 mime 类型,以便它在 Web 浏览器中正确显示。上传结果请见:https://s3.amazonaws.com/AppaApps/z/p.jpg

    use warnings FATAL => qw(all);
    use strict;
    use Data::Dump qw(dump);
    use Amazon::S3;

    #----------------------------------------------------------------------
    # Constants
    #----------------------------------------------------------------------

    my $s3 = Amazon::S3->new
     ({aws_access_key_id     => "...",
       aws_secret_access_key => "...",
       retry                 => 1
      }
     );

    my $b = $s3->bucket("AppaApps");   # Our bucket
    my $f = "z/p.jpg";                 # A specific file (key) on S3
    my $F = "p.jpg";                   # Local file to upload

    #----------------------------------------------------------------------
    # Upload a file
    #----------------------------------------------------------------------

    $b->add_key_filename($f, "p.jpg", 
     {"x-amz-storage-class"=>"REDUCED_REDUNDANCY", 'x-amz-meta-version'=>'12.11.22', acl_short=>'public-read',
      "Content-Type"=>"image/jpeg", 
     });
    print dump($b->errstr), "\n" if $b->errstr;

【讨论】:

  • 此示例中使用的功能:5.16 是什么?
  • @bodacydo:必须是say 运算符。最好避免依赖它,或者至少将其写为use v5.16; - 更短且中肯
【解决方案2】:

虽然这需要安装第 3 方软件,但作为一种解决方法,我在我的 perl 脚本中使用 s3cmd 和系统调用将任意数据上传到我的存储桶。

s3cmd 可以在这里找到:http://s3tools.org/s3cmd,一旦你的密钥和权限设置好了,就像在 perl 脚本中调用以下命令一样简单。 (**非常感谢 Michal Ludvig 让这个工具易于使用和免费。)

`s3cmd put YOUR_FILE s3://YOUR_BUCKET/`;

这是一个 hack,但如果你愿意尝试一个不优雅但务实的解决方案,这就是我所做的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-30
    • 1970-01-01
    • 2017-04-18
    • 2019-02-26
    • 1970-01-01
    相关资源
    最近更新 更多