我试图在PHP中创建一个存档和检索系统 . 当用户单击存档按钮时,特定文件将从标准存储移动到冰川存储,并且当点击冰川存储中的恢复按钮文件时将检索到标准存储 .
使用AWS php SDK 3.0 api我已经成功地将文件移动到冰川保险库并且用于检索存档检索作业已启动并且我在3-5小时后获得了作业ID并且在5小时后使用该作业ID我尝试了getJobOutput功能 . 我得到的响应与api文档中提到的相同,但我没有在我的s3存储桶中获取已恢复的文件 .
这是我上传到冰川并从冰川恢复的代码
public function archiveAndRestore() {
$this->s3Client = new S3Client(Configure::read('AWScredentials'));
$this->glacier = GlacierClient::factory(Configure::read('AWScredentials'));
// Upload to glacier
$this->s3Client->registerStreamWrapper();
$context = stream_context_create([
's3' => ['seekable' => true]
]);
$result = $this->glacier->uploadArchive(array(
'vaultName' => 'archiveTest',
'archiveDescription' => 'File Name is archiveTest.txt ',
'body' => fopen('s3://storage-bucket/Videos/archiveTest.txt', 'r', false, $context),
));
$archiveid = $result->get('archiveId');
$jobId = $this->glacier->initiateJob([
'accountId' => '-',
'vaultName' => 'archiveTest',
'jobParameters' => [
'Type' => 'archive-retrieval',
'ArchiveId' => 'ORgyyyqsKwoopp110EvFoyqj3G-csmOKLyy3IJnWF9Dpd8BJfwerEhg241nxHf6y6kNUUyhUHOaY4y8QvWBGESmAopa80f6GZ9C05tyyKANhY-qfBUB6YkfTABg',
],
]);
$this->s3Client->registerStreamWrapper();
$context = stream_context_create([
's3' => ['seekable' => true]
]);
$stream = fopen('s3://storage-bucket/RetrivedFiles/test1.txt', 'w');
$result = $this->glacier->getJobOutput([
'accountId' => '-',
'jobId' => '2dddfffffff9SwZIOPWxcB7TLm_3apNx--2rIiD7SgjOJjjkrerrcN1YCtivh_zsmpLyczY4br-bhyyX0Ev5B7e6-D1',
'vaultName' => 'archiveTest',
'saveAs' => $stream,
]);
fclose($stream);
}
根据文档(aws GetJobOutput operation documentation),getJobOutput函数的saveAs属性是指定应该下载操作内容的位置 . 可以是文件的路径,fopen返回的资源,或Guzzle \ Http \ EntityBodyInterface对象 . 因为我也在s3中给出了文件的路径 . 会是什么问题 . 任何帮助都非常感谢 . 提前致谢 .
这是响应$ result中包含的结果,与文档中提到的完全相同
Aws \ Result Object([data:Aws \ Result:private] => Array([body] => GuzzleHttp \ Psr7 \ Stream Object([stream:GuzzleHttp \ Psr7 \ Stream:private] =>资源ID#25 [size :GuzzleHttp \ Psr7 \ Stream:private] => [seekable:GuzzleHttp \ Psr7 \ Stream:private] => 1 [可读:GuzzleHttp \ Psr7 \ Stream:private] => 1 [可写:GuzzleHttp \ Psr7 \ Stream:private] => 1 [uri:GuzzleHttp \ Psr7 \ Stream:private] => php:// temp [customMetadata:GuzzleHttp \ Psr7 \ Stream:private] => Array())[checksum] => c176c1843fd0c0fc662lh9bb8de916540e6f9dpk9b22020bbb8388jk6f81d1c2 [status] => 200 [contentRange] => [acceptRanges] => bytes [contentType] => application / octet-stream [archiveDescription] =>文件名是children-wide.jpg [@metadata] =>数组([statusCode] => 200 [effectiveUri ] => https://glacier.region-name.amazonaws.com/-/vaults/vaultname/jobs/gFdjAl4xhTAVEnmffgfg-Ao3-xmmjghfmqkCLOR1m34gHLQpMd0a3WKCiRRrItv2bklawwZnq9KeIch3LKs8suZoJwk2_/output [headers] =>数组([x-amzn-requestid] => NzAiVAfrMQbpSjj- 2228iiKWK_VteDwNyFTUR7K yu0duno [x-amz-sha256-tree-hash] => c176c1843khfullc662f09bb8de916540e6f9dcc9b22020bbb8388de6f81d1c2 [accept-ranges] => bytes [x-amz-archive-description] =>文件名是children-wide.jpg [content-type] => application / octet-stream [content-length] => 1452770 [date] =>星期二,2017年1月31日03:34:26 GMT [connection] => close)[transferStats] => Array([http] => Array([ 0] =>数组())))))
1 回答
当您从Glacier恢复文件时,它将不再将Standard作为存储类 . 它仍然会显示冰川 . 确定文件是否从Glacier下来,
请改用GetObject, and look at the Restore value of the result . 并将Range设置为"bytes=0-0"以跳过检索文件本身的内容 . 并确保捕获异常
如果对象位于Glacier中且未恢复,则AWS将抛出InvalidObjectStateError,如果未捕获到错误,脚本将会死亡 .
这是您将看到的项目已恢复 .
如果物品还在冰川中,这就是你将获得的
我希望这可以帮助你和其他有同样问题的人 .