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
AWS PHP SDK:在预先签名的URL中限制S3文件上载大小_Php_Amazon Web Services_File Upload_Amazon S3 - Fatal编程技术网

AWS PHP SDK:在预先签名的URL中限制S3文件上载大小

AWS PHP SDK:在预先签名的URL中限制S3文件上载大小,php,amazon-web-services,file-upload,amazon-s3,Php,Amazon Web Services,File Upload,Amazon S3,我正在做一个项目,涉及生成S3 URL,其他人可以使用该URL将文件上载到我的S3存储桶。下面是一个简单的工作示例: 现在,如果我将该文件放在internet可访问的位置,我的web服务器可用于获取新的签名上载URL: $curlhttp://my.domain.com/some/page.php https://s3.amazonaws.com/mybucket/tmp/someID?x-amz acl=专用&大量aws参数。。。 $curl-X PUT-d“@someFile”https

我正在做一个项目,涉及生成S3 URL,其他人可以使用该URL将文件上载到我的S3存储桶。下面是一个简单的工作示例:


现在,如果我将该文件放在internet可访问的位置,我的web服务器可用于获取新的签名上载URL:

$curlhttp://my.domain.com/some/page.php
https://s3.amazonaws.com/mybucket/tmp/someID?x-amz acl=专用&大量aws参数。。。
$curl-X PUT-d“@someFile”https://s3.amazonaws.com/mybucket/tmp/someID?x-amz acl=专用&大量aws参数。。。
$
这成功地将一个本地文件上传到我的bucket中,这样我就可以在S3中使用它了

假设我不太担心人们在短时间内生成许多URL并将许多文件上传到我的bucket,但我想限制上传文件的大小。许多参考资料建议将策略附加到已签名的URL:


此版本生成的URL(没有任何错误指示)可以以相同的方式使用。我不确定是否需要在策略中包含这些条件(
acl
bucket
开头),但我不认为包含它们会破坏策略

理论上,尝试使用此签名URL上载大于8kib的文件会导致S3中止上载。但是,使用更大的文件进行测试表明,
curl
仍然可以愉快地上传文件:

$ls-lh file.txt
-rw-rw-r--1百万分之一百万分之一百万分之一210K Jan 2 00:41 file.txt
$curlhttp://my.domain.com/some/page.php
https://s3.amazonaws.com/mybucket/tmp/someOtherID?x-amz acl=专用&大量aws参数。。。
$curl-X PUT-d“@file.txt”https://s3.amazonaws.com/mybucket/tmp/someOtherID?x-amz acl=专用&大量aws参数。。。
$
检查bucket表明,确实上传了大文件,并且文件的大小大于策略所假定的大小

由于各个页面显示了附加策略的不同方式,我也尝试了以下版本:

'Policy'=>json\u编码($Policy)
'Policy'=>base64_编码(json_编码($Policy))
但是,使用这些版本中的任何一个生成的URL都允许上载大于指定大小的文件

我是否错误地附加了策略,或者以这种方式限制上传到S3是否存在根本限制


对于我的web服务器,我正在使用HHVM 3.11.1和AWS SDK For PHP的3.14.1版。

S3上载策略不能用于预签名URL

策略文档可以与一起使用

预签名URL和HTML发布表单是两种不同的上传到S3的方法。前者可以说比后者更简单,但灵活性更低

更新

如果必须在不使用浏览器的情况下上载文件,则可以使用PHP的
curl
函数、库(如)或使用以下命令行复制HTML POST表单的请求:

curl 'https://s3-bucket.s3.amazonaws.com/' \
    -F 'key=uploads/${filename}' \
    -F 'AWSAccessKeyId=YOUR_AWS_ACCESS_KEY' \
    -F 'acl=private' \
    -F 'success_action_redirect=http://localhost/' \
    -F 'policy=YOUR_POLICY_DOCUMENT_BASE64_ENCODED' \
    -F 'signature=YOUR_CALCULATED_SIGNATURE' \
    -F 'Content-Type=image/jpeg' \
    -F 'file=@file.jpg'

您可以尝试将特定策略添加到您的bucket中吗

$s3client->putBucketPolicy(array(
    'Bucket' => $bucket,
    'Policy' => json_encode(array(
        'conditions' => array(
            array(
                'content-length-range', 0, 8*1024,
                'starts-with', '$key', 'tmp/'
                ...
在这之后,只需使用普通的putObject命令

$command = $s3client->getCommand('PutObject', [
    'ACL' => 'private',
    'Body' => '',
    'Bucket' => 'mybucket',
    'Key' => 'tmp/' . $id]);

我知道HTML POST表单是一种选择,但我并不是专门针对浏览器,所以在我的情况下这不是一个解决方案。谢谢你的建议!POST字段比我想要的要复杂一点——我真的想只生成一个URL,可以复制/粘贴到任何支持HTTP PUT的客户端。不过,我非常喜欢这个解决方案——支持HTTP PUT的客户端可能也会支持POST字段,因此我将努力将其作为上传方法提供。我认为这是正确的方向——我需要将策略附加到bucket本身,而不是PutObject请求本身。但是,看起来
内容长度范围
仅作为浏览器上载策略条件受支持,因此我不确定是否可以在预先指定的URL中包含文件大小限制,或者作为bucket本身的属性。