在我目前的项目中,我需要每4秒检查一次S3存储桶内容以获取新文件.
每次使用该服务时,此脚本将运行大约3个小时,并且在一个前缀的末尾将有大约2700个文件.
这是我列出这些文件的功能:
public function listFiles($s3Prefix, $limit, $get_after = ''){
$command = $this->s3Client->getCommand('ListObjects');
$command['Bucket'] = $this->s3_bucket;
$command['Prefix'] = $s3Prefix;
$command['MaxKeys'] = $limit;
$command['Marker'] = $s3Prefix.'/'.$get_after;
//command['Query'] = 'sort_by(Contents,&LastModified)';
$ret_s3 = $this->s3Client->execute($command);
$ret['truncated'] = $ret_s3['IsTruncated'];
$ret['files'] = $ret_s3['Contents'];
return $ret;
}// listFiles
Run Code Online (Sandbox Code Playgroud)
我需要的是获取文件,按LastModified字段排序,所以我不需要获取超过2k的文件.是否有额外的参数,如
command['Query'] = 'sort_by(Contents,&LastModified)';
Run Code Online (Sandbox Code Playgroud)
在php API中添加?
----------已编辑------------
正如Abhishek Meena回答的那样,在shell中可以使用
aws s3api list-objects --bucket "bucket-name" --prefix "some-prefix" --query "Contents[?LastModified>=\`2017-03-08\`]"
Run Code Online (Sandbox Code Playgroud)
我正在寻找的是如何在PHP中实现它.
PHP API: https://github.com/aws/aws-sdk-php
我正在尝试使用 AWS SDK PHP 生成的预签名帖子将文件(用于测试的图像)上传到我的 s3 存储桶。首先我生成预签名的帖子,然后我使用 Postman 或通过简单的 html 表单使用给定的 PostObjectV4 数据手动创建请求...填写完所有内容后,请求结果为“访问被拒绝”:-(。与客户端关联的用户生成 PostObjectV4 在相应的存储桶上已允许 s3:PutObject 策略。
我已经尝试过:
预签名后生成的 PHP 代码(数据位于 $postObject 中):
$assetAwsS3Key = $this->getAssetAwsS3Key($asset);
$options = [
['starts-with', '$key', 'myDir/'],
];
// Optional: configure expiration time string
$expires = '+24 hours';
// Set some defaults for form input fields
$formInputs = ['acl' => 'private'];
$postObject = new PostObjectV4(
$this->buildAwsS3UserClient(),
$this->awsBucketName,
$formInputs,
$options,
$expires
);
// Get attributes to set on an HTML form, e.g., action, method, …Run Code Online (Sandbox Code Playgroud) 我正在编写一个单元测试,我想检查该方法是否publish()被调用一次或多次。这是我整个测试课的一个片段:
<?php
namespace App\Tests\Unit;
use Aws\Sns\SnsClient;
use Exception;
use PHPUnit\Framework\TestCase;
class MyClassTest extends TestCase
{
/** @var SnsClient */
private $snsClient;
public function setUp(): void
{
$this->snsClient = $this->getMockBuilder(SnsClient::class)->disableOriginalConstructor()->getMock();
}
/**
* @throws Exception
*/
public function testNoCaseIdentifierSns()
{
$this->snsClient->expects($this->once())->method('publish')->with([
[
'doc_id' => 1,
'bucket' => 'some_bucket',
'key' => 'test.tiff/0.png'
],
'topic_arn'
]);
}
}
Run Code Online (Sandbox Code Playgroud)
但是当我运行上面的代码时,出现以下错误:
尝试配置方法“publish”,但无法配置,因为它不存在、尚未指定、是最终的或静态的
我想这里的问题是AWS中的方法定义为@method(参见此处):
* @method \Aws\Result publish(array $args = [])
Run Code Online (Sandbox Code Playgroud)
可以模拟该方法吗?我在这里缺少什么?
更新
在遵循评论建议后,我将代码转换为以下内容:
$this->snsClient->expects($this->once())->method('__call')->with([
'Message' => json_encode([
'doc_id' => …Run Code Online (Sandbox Code Playgroud) SQS我正在尝试使用 php SDK从 AWS 中删除一条消息。我有以下配置。
$sqsClient = new SqsClient([
'version' => '2012-11-05',
'region' => 'us-east-1',
'credentials' => [
'key' => KEY,
'secret' => SECRET
]
]);
Run Code Online (Sandbox Code Playgroud)
然后我尝试删除如下:
$sqsClient->deleteMessage([
'QueueUrl' => quque-url
'ReceiptHandle' => handle
]);
Run Code Online (Sandbox Code Playgroud)
我在初始化时收到以下错误:
Credentials must be an instance of Aws\\Credentials\\CredentialsInterface, an associative array that contains \"key\", \"secret\", and an optional \"token\" key-value pairs, a credentials provider function, or false."
我使用的凭据是正确的。在我没有传递配置之前,也出现了同样的错误。如何解决这个问题?
我使用的是 AWS PHP SDK 版本 3。我能够使用 API 创建安全组,以及创建 IP 权限规则。我不明白的是如何为 IP 权限规则命名。
这是我所拥有的:
$params =
[
'Description' => 'My Security Group',
'GroupName' => 'my_security_group',
'VpcId' => 'vpc-a9d2h3d7',
'TagSpecifications' => [
[
'ResourceType' => 'security-group',
'Tags' =>
[
['Key' => 'Name', 'Value' => 'My Security Group']
]
]
],
];
$Ec2Client->createSecurityGroup($params);
Run Code Online (Sandbox Code Playgroud)
至此群组就创建完成了
然后我创建一个 IP 权限规则:
$ip_permissions = [
'GroupName' => 'my_security_group',
'FromPort' => 0,
'ToPort' => 65535,
'IpProtocol' => 'tcp',
'IpRanges' => [['CidrIp' => 'xx.xxx.xx.xxxx/32', 'Description' => 'Main Office']],
];
$Ec2Client->authorizeSecurityGroupIngress($ip_permissions); …Run Code Online (Sandbox Code Playgroud) 我正在将我的代码从AWS PHP SDK1迁移到SDK2(https://github.com/aws/aws-sdk-php).
我有一个图像上传器.在我以前的版本中,我会指定我的图像的Content-Type,如下所示:
$response = $this->s3->create_object(
$bucket,
$key,
array(
'fileUpload'=>$file_resource,
'contentType'=>$mime,
'acl' => AmazonS3::ACL_PUBLIC,
)
);
Run Code Online (Sandbox Code Playgroud)
这是我的新版本:
$response = $this->s3->upload(
$bucket,
$key,
$file_resource,
'public-read',
array('params' => array('Metadata' => array('ContentType'=>$mime)))
);
Run Code Online (Sandbox Code Playgroud)
我试过的ContentType不同的拼法,在S3网站修改它的名字看起来像"X-AMZ-元的contentType",而"的ContentType"的值是默认的"二进制/八位字节流".
我也尝试过使用EntityBody功能,但结果相同:
$response = $this->s3->upload(
$this->bucket,
$to,
EntityBody::factory($file_resource),
'public-read',
array('params' => array('Metadata' => array('ContentType'=>$mime)))
);
Run Code Online (Sandbox Code Playgroud)
如何在此新API中设置内容类型?
编辑:我在文档中的某处看到:
AWS SDK for PHP将尝试自动确定用于存储对象的最合适的Content-Type标头.如果您使用的是较不常见的文件扩展名并且未自动添加Content-Type标头,则可以通过将ContentType选项传递给操作来添加Content-Type标头.
首先,我正在上传简单的图像,但根据我的S3仪表板,它们被上传为'binary/octet-stream'.关于他们的第二点,我尝试过多种具有'ContentType'的数组组合我不知道为什么它不起作用......
我试图找到这方面的详细信息,但找不到任何确认。我正在使用 PHP SDK 并尝试了以下测试(下面的电子邮件是一个示例,但 gmail 支持电子邮件中的 UTF-8 字符):
我实际上发送了“?” 就像使用 PHP SDK 并查看它在 POST 请求正文中编码(URL)的查询一样:
Destination.ToAddresses.member.1=myemail%2B%E2%9C%96%40gmail.com
这是我从 SES 回复中得到的信息:
<ErrorResponse xmlns="http://ses.amazonaws.com/doc/2010-12-01/">
<Error>
<Type>Sender</Type>
<Code>InvalidParameterValue</Code>
<Message>Local address contains control or whitespace</Message>
</Error>
<RequestId>f28c2325-5c09-11e6-9156-ef3e33b8e223</RequestId>
</ErrorResponse>
Run Code Online (Sandbox Code Playgroud)
我错过了什么还是不支持?如果不是,是否有计划支持它?
我经常使用 AWS 服务,并且当我连接 Amazon 时,我的 PHP SDK 自动从我的 ec2 实例检索凭证。
我现在有一个想要使用的库,在实例化该类时还需要包含我的 AWS 密钥和访问密钥。
如何通过 AWS PHP SDK 检索当前的访问令牌和密钥,这样我就不会将密钥硬编码到我的应用程序中?
我正在制作一个面部追踪思维视频AWS Rekognition( StartFaceSearch)。它将返回作业 ID。我已经设置了所有SQS SNS部分。我的问题是我无法使用receiveMessage(). 甚至listQueues()也不工作。它给出了以下错误。
“ https://sqs.us-east-1.amazonaws.com ”上的“ListQueues” ;AWS HTTP 错误:客户端错误:
POST https://sqs.us-east-1.amazonaws.com导致403 Forbidden响应:< ErrorResponse xmlns="http://queue.amazonaws.com/doc/2012-11-05/">发件人<代码>S(已截断...)SignatureDoesNotMatch ( client): 我们计算的请求签名与您提供的签名不匹配。检查您的 AWS 秘密访问密钥和签名方法。有关详细信息,请参阅服务文档。此请求的规范字符串应该是 'POST / .... < continue.............
代码如下。AWS PHP 开发工具包版本 3.64.11。
$queueUrl = "https://sqs.us-east-1.amazonaws.com/xxxxxxx/facetrackingreceive";
// Get the client from the builder by namespace
$sqs_client = new SqsClient(array(
'credentials' => array(
'key' => 'xxxxxxxxxx',
'secret' => 'xxxxxxxxxxxxxxxxxxxxxxx',
),
'version' => '2012-11-05',
'region' => 'us-east-1',
'http' => …Run Code Online (Sandbox Code Playgroud) 我试图在某个标识符之后获取存储桶中的所有文件。
这是我的代码,省略了不相关的部分。
require_once LIB . DS . 'Aws/vendor/autoload.php';
use Aws\S3\S3Client as S3Client;
use Aws\Credentials as Credentials;
$s3 = new S3Client([
'region' => $region,
'version' => 'latest',
'key' => AWS_KEY,
'secret' => AWS_SECRET,
'credentials' => $credentials
]
);
$data = $s3->listObjectsV2(
[
'Bucket' => <MY BUCKET>,
// the response content should be after this record
'StartAfter' => '302760677',
'MaxKeys' => 2
]);
print_r($data);
Run Code Online (Sandbox Code Playgroud)
我得到的结果如下:
Aws\Result Object
(
[data:Aws\Result:private] => Array
(
[IsTruncated] => 1
[Contents] => Array
(
[0] => Array …Run Code Online (Sandbox Code Playgroud) aws-php-sdk ×10
php ×7
amazon-s3 ×4
amazon-iam ×2
amazon-sqs ×2
aws-sdk ×2
amazon-ses ×1
laravel ×1
phpunit ×1