Php 使用v4创建一个上传表单文件到s3

Php 使用v4创建一个上传表单文件到s3,php,file-upload,amazon-web-services,amazon-s3,Php,File Upload,Amazon Web Services,Amazon S3,编辑2:我删除了文件awskeyid-因此现在s3接受x-amz-signature字段,但现在我返回一个错误:我们计算的请求签名与您提供的签名不匹配。检查您的密钥和签名方法 你猜我算错签名了,有什么想法吗 编辑:我已经根据我找到的文档编辑了代码,我想我正在计算签名权,但它仍然不起作用,当我把它放在表单中一个名为“签名”的字段中时,我得到一个错误,该机制不受支持,我应该使用新机制,但是如果我将签名字段的名称更改为x-amz-signature,我会返回一个错误,即没有名为“signature”的

编辑2:我删除了文件awskeyid-因此现在s3接受x-amz-signature字段,但现在我返回一个错误:我们计算的请求签名与您提供的签名不匹配。检查您的密钥和签名方法

你猜我算错签名了,有什么想法吗

编辑:我已经根据我找到的文档编辑了代码,我想我正在计算签名权,但它仍然不起作用,当我把它放在表单中一个名为“签名”的字段中时,我得到一个错误,该机制不受支持,我应该使用新机制,但是如果我将签名字段的名称更改为x-amz-signature,我会返回一个错误,即没有名为“signature”的字段

我有一个工作表单,可以直接从浏览器上传文件到amazon s3,我已经将我的bucket切换到法兰克福地区,该地区不支持旧的政策签署

所以我试着编辑我的表单和创建的策略,但很幸运 任何帮助都将不胜感激

这是我的政策:

    $policy = json_encode(array(
            'expiration' => date('Y-m-d\TG:i:s\Z', strtotime('+6 hours')),
            'conditions' => array(
                    array(
                            'bucket' => $data['bucket']
                    ),
                    array(
                            'acl' => 'private'
                    ),
                    array(
                            'starts-with',
                            '$key',
                            'Zips/Uploads'
                    ),
                    array(
                            'content-length-range', 0, 500000000
                    ),
                    array(
                            "x-amz-algorithm"=> "AWS4-HMAC-SHA256"
                    ),
                    array (
                            "x-amz-credential"=> AMAZON_KEY."/20160111/eu-central-1/s3/aws4_request"
                    ),
                    array(
                            "x-amz-date"=> "20151101T000000Z"
                    ),

                )

    ));

    $data['base64Policy'] = base64_encode($policy);
    $signing_key1 = hash_hmac('sha256', "AWS4" .AMAZON_SECRET_KEY , "20151101", true);
    $signing_key2 = hash_hmac('sha256', $signing_key1, AMAZON_REGION,true); 
    $signing_key3 = hash_hmac('sha256', $signing_key2, "s3",true);
    $signing_key4 = hash_hmac('sha256', $signing_key3, "aws4_request",true);x
    $data['signature'] = base64_encode(hash_hmac('sha256',$signing_key4, $data['base64Policy'],true));
这就是我用的表格

<form class="startfileupload" action="//s3.eu-central-1.amazonaws.com/<?php echo $bucket; ?>/" method="post" enctype="multipart/form-data">
<input type="hidden" name="key" value="${filename}" /><br />
<input type="hidden" name="acl" value="private" />
<input type="hidden" name="X-amz-Algorithm" value="AWS4-HMAC-SHA256" />
<input type="hidden" name="X-Amz-Credential" value="<?php echo $accesskey; ?>/20160111/eu-central-1/s3/aws4_request" />
<input type="hidden" name="X-Amz-Date" value="20151101T000000Z" />
<input type="hidden" name="policy" value="<?php echo $base64Policy; ?>">
<input type="hidden" name="X-Amz-Signature" value="<?php echo $signature; ?>">
<input type="file" name="file" /> <br />
根据此(Java版本):

通过一些帮助,我找到了答案,这是2的组合 缺失的部分(其中一项在评论中提及):

1) 需要设置此选项:

System.setProperty(SDKGlobalConfiguration.ENABLE_S3_SIGV4_SYSTEM_PROPERTY, "true");
2) 必须设置“端点”(上传或下载时不需要该端点) 下载):

还可以选择添加以下内容:

s3Client.setS3ClientOptions(new S3ClientOptions().withPathStyleAccess(true));

S3不久前从签名v2移动到签名v4,因此需要更新对请求进行签名的代码。您正在使用官方SDK吗?他们为您处理所有这些问题。这个问题似乎离题了,因为它是关于为V2编写的代码片段,需要大量重写才能满足
POST
uploads的V4身份验证的文档要求:我获得了aws的官方和laravel sdk,我读了文档,但仍然发现很难理解如何创建我的policy@RyanParman我找不到官方sdk是如何为我处理的?看看
s3Client.setS3ClientOptions(new S3ClientOptions().withPathStyleAccess(true));