Perl v5.36.0 的 Multipart S3 API 中的 PartNumber 正在转换为字符串

问题描述 投票:0回答:1

我正在尝试使用 perl 脚本通过命令行执行 aws S3 多部分 api 调用,下面是我的相关代码片段:

    my $part_no = 1;
    my %final_upload_file;
    my @multi_part_hash;
    
    foreach my $temp_file (@split_files) {
       my $tota_no_parts= @split_files;
       my $upload_part = "aws s3api upload-part --bucket <s3_bucket_name> --key ".$filename." --part-number ".$part_no." --body ".$temp_file." --upload-id ".$UploadId;
       $temp_json=`$upload_part`;
       
       my %upload_response = %{decode_json $temp_json};
    
       my $eTag = $upload_response{'ETag'};
       my %temp_part_hash;
       $temp_part_hash{'PartNumber'} = int($part_no);
       $temp_part_hash{'ETag'} = $eTag;
       push @multi_part_hash, \%temp_part_hash;
    
        if( $part_no le $tota_no_parts)
        {
         $part_no++;
        }
    }
my %final_hash;
$final_hash{'Parts'} = \@multi_part_hash;
print Dumper(\%final_hash);

所以直到此时哈希值的数据类型才是正确的,下面是o/p:

$VAR1 = { '零件' => [ { '零件编号' => 1, 'ETag' => '"46f438ba2afd8d6dc03958b867a349b1"' }, { 'ETag' => '"7b1e03e9ed7bb49d907e5a2d25b89159"', '零件编号' => 2 }, { 'ETag' => '"30c23faad792c9b7c4b05356305cb6b0"', '零件编号' => 3 }, { 'ETag' => '"979174e5353386a75d8e36d223d22ea2"', '零件编号' => 4 }, { '零件编号' => 5, 'ETag' => '"ee93774d0a2ec9c27fae6a4fb3496804"' }, { '零件编号' => 6, 'ETag' => '“9a2c5a1abe6869f370b07d76c270e569”' } ] };

下面是我尝试执行的进一步操作,以便执行最终的完整分段上传 API 调用:

my $json_text = encode_json \%final_hash;
print("\$json_text: $json_text\n");
my $json_filename = 'test.json';
 open(FH, '>', $json_filename) or die $!;
 print FH $json_text;
 close(FH);

但是如果我们仔细观察下面的o/p,似乎现在所有零件编号的值都被转换为字符串 PSB:

$json_text: {"零件":[{"零件编号":"1","ETag":""46f438ba2afd8d6dc03958b867a349b1""},{"ETag":""7b1e03e9ed7bb49d907e5a2d25b89159"","零件编号":"2"},{"ETag" :""30c23faad792c9b7c4b05356305cb6b0"","零件编号":"3"},{"ETag":""979174e5353386a75d8e36d223d22ea2"","零件编号":"4"},{"零件编号":"5","ETag":" "ee93774d0a2ec9c27fae6a4fb3496804""},{"PartNumber":"6","ETag":""9a2c5a1abe6869f370b07d76c270e569""}]}

那么我可以应用什么可能的修复来修复其他完整的多部分上传 api 调用正在下降,因为它期望partNumber而不是字符串的整数。

错误信息:

参数验证失败:参数类型无效 MultipartUpload.Parts[0].PartNumber,值:1,类型:, 有效类型: 参数类型无效 MultipartUpload.Parts[1].PartNumber,值:2,类型:, 有效类型: 参数类型无效 MultipartUpload.Parts[2].PartNumber,值:3,类型:, 有效类型: 参数类型无效 MultipartUpload.Parts[3].PartNumber,值:4,类型:, 有效类型: 参数类型无效 MultipartUpload.Parts[4].PartNumber,值:5,类型:, 有效类型: 参数类型无效 MultipartUpload.Parts[5].PartNumber,值:6,类型:, 有效类型:

amazon-web-services perl amazon-s3
1个回答
0
投票

这就是 Cpanel::JSON::XS::Type 存在的原因。

#! /usr/bin/perl
use warnings;
use strict;

use Cpanel::JSON::XS qw{ encode_json };
use Cpanel::JSON::XS::Type;

my $struct = {Parts => [{PartNumber => "1",
                         ETag => "46f438ba2afd8d6dc03958b867a349b1"},
                        {ETag => "7b1e03e9ed7bb49d907e5a2d25b89159",
                         PartNumber => "2"},
                        {ETag => "30c23faad792c9b7c4b05356305cb6b0",
                         PartNumber => "3"},
                        {ETag => "979174e5353386a75d8e36d223d22ea2",
                         PartNumber => "4"},
                        {PartNumber => "5",
                         ETag => "ee93774d0a2ec9c27fae6a4fb3496804"},
                        {PartNumber => "6",
                         ETag => "9a2c5a1abe6869f370b07d76c270e569"}
             ]};
print encode_json($struct,
                  {Parts => json_type_arrayof({
                      PartNumber => JSON_TYPE_INT,
                      ETag       => JSON_TYPE_STRING})});

输出:

{"Parts":[{"ETag":"46f438ba2afd8d6dc03958b867a349b1","PartNumber":1},{"ETag":"7b1e03e9ed7bb49d907e5a2d25b89159","PartNumber":2},{"ETag":"30c23faad792c9b7c4b05356305cb6b0","PartNumber":3},{"PartNumber":4,"ETag":"979174e5353386a75d8e36d223d22ea2"},{"PartNumber":5,"ETag":"ee93774d0a2ec9c27fae6a4fb3496804"},{"PartNumber":6,"ETag":"9a2c5a1abe6869f370b07d76c270e569"}]}
© www.soinside.com 2019 - 2024. All rights reserved.