Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用perl获取文件并将其上载到s3_Perl_Amazon Web Services_Amazon S3 - Fatal编程技术网

使用perl获取文件并将其上载到s3

使用perl获取文件并将其上载到s3,perl,amazon-web-services,amazon-s3,Perl,Amazon Web Services,Amazon S3,我正在尝试使用Perl中的Amazon::s3模块从s3获取文件。我能够成功下载没有前缀的文件,但无法获取前缀文件,如test/abc.txt 我正在使用下面的代码 sub export_bucket { my ($conn, $bucket, $directory) = @_; $bucket = $conn->bucket($bucket); my $response = $bucket->list(); print $response->{bucket}.

我正在尝试使用Perl中的
Amazon::s3
模块从s3获取文件。我能够成功下载没有前缀的文件,但无法获取前缀文件,如
test/abc.txt

我正在使用下面的代码

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;
}
建议我应该做哪些更改,以便在出现前缀/文件夹时,我也可以下载该文件夹


谢谢

在失败的情况下,$directory可能已经有一个尾随“/”(或者$key->{key}前面有一个斜杠)?请尝试在代码中调试打印$directory和$path,以准确查看字符串参数。

如果目标目录不存在,则需要修改代码以在本地文件系统上创建目标目录。它应该是这样的:

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;
}

$directory是保存文件的目录,如/home/users/xyz/obs/,而$path将是/home/users/xyz/obs/test/readme-cron.txt,其中test/是前缀,readme-cron.txt位于s3中的前缀之下。如果$directory后面有这样的斜杠,那么代码将在“obs”和“test”之间获得一个双斜杠(“/”)。再次打印$path变量以进行检查。这些是记录的值,obs和test之间没有双斜杠。测试不包含任何前面的斜杠。