使用Perl获取并上传文件并将前缀文件上传到s3

问题描述:

我试图在Perl中使用Amazon::S3模块从s3获取文件。我成功地能够下载没有前缀但无法获取像test/abc.txt这样的前缀文件的文件。使用Perl获取并上传文件并将前缀文件上传到s3

我正在使用下面的代码。

sub export_bucket { 
    my ($conn, $bucket, $directory) = @_; 
    $bucket = $conn->bucket($bucket); 
    my $response = $bucket->list(); 
    print $response->{bucket}."\n"; 
    for my $key (@{ $response->{keys} }) { 
     print "\t".$key->{key}."\n"; 
     _export_file($conn,$bucket,$key->{key}, $directory.'/'.$key->{key}); 
    } 
} 

sub _export_file { 
    my ($conn,$bucket,$name,$path) = @_; 
    print "Downloading $name file","\n"; 
    my $test = $bucket->get_key_filename($name,'GET',$path); 
    print Dumper($test); 
    my $acl = $bucket->get_acl($name); 
    print Dumper($acl); 
    open my $acl_file, '>', $path.'.acl'; 
    print $acl_file $acl; 
    close $acl_file; 
} 

建议我应该做些什么改变,这样当有前缀/文件夹时,我应该可以下载该文件夹。

感谢

您需要修改代码以在本地文件系统上创建目标目录(如果它尚不存在)。它应该是这个样子:

use File::Path qw[make_path]; 

sub export_bucket { 
    my ($conn, $bucket, $directory) = @_; 
    $bucket = $conn->bucket($bucket); 
    my $response = $bucket->list(); 
    print $response->{bucket} . "\n"; 
    for my $key (@{ $response->{keys} }) { 
     print "\t" . $key->{key} . "\n"; 
     _export_file($conn, $bucket, $key->{key}, $directory . '/' . $key->{key}); 
    } 
} 

sub _export_file { 
    my ($conn, $bucket, $name, $path) = @_; 
    print "Downloading $name file", "\n"; 
    my $test = $bucket->get_key_filename($name, 'GET', $path); 
    print Dumper($test); 
    my $acl = $bucket->get_acl($name); 
    print Dumper($acl); 

    ## get path directory part 
    my ($dir_part) = $path =~ /(.+)\/[^\/]+$/; 

    unless (-d $dir_part) { 
     make_path($dir_part); 
    } 

    open my $acl_file, '>', $path . '.acl'; 
    print $acl_file $acl; 
    close $acl_file; 
} 
+1

感谢它的工作。 –

也许$目录下有一个“/”结尾已经在情况下失败(或$键 - > {}键具有前斜线)?尝试在代码中调试打印$目录和$路径以准确查看您的字符串参数。

+0

$目录的目录,文件将保存例如/ home /用户/ XYZ/OBS /和$路径是/家庭/用户/ XYZ/OBS /测试/自述-的cron .txt其中test /是前缀,而readme-cron.txt在s3的前缀下。 –

+0

如果$目录有这样的尾部斜线,那么你的代码会在“obs”和“test”之间得到一个双斜杠(“//”)。再次,_print $ path变量来检查this_。 –

+0

这些是记录值,它们在obs和测试之间没有双斜杠。测试不包含任何前面的斜杠。 –