我正在尝试使用 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,类型: , 有效类型:
这就是 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"}]}