0

我想在php中創建一個檔案和檢索系統。當用戶點擊存檔按鈕時,特定文件將從標準存儲移動到冰川存儲,並且當點擊冰川存儲中的恢復按鈕文件時,將恢復到標準存儲。存檔和從亞馬遜冰川存儲檢索aws

使用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)的saveAs getJobOutput功能的屬性來指定操作的內容應被下載。可以是文件的路徑,fopen返回的資源或Guzzle \ Http \ EntityBodyInterface對象。正如我正在給s3中的文件路徑一樣。這將是什麼問題。任何幫助真的很感激。提前致謝。

這是包含在響應$結果的結果作爲文檔

Aws\Result Object ([data:Aws\Result:private] => Array ([body] => GuzzleHttp\Psr7\Stream Object ([stream:GuzzleHttp\Psr7\Stream:private] => Resource id #25 [size:GuzzleHttp\Psr7\Stream:private] => [seekable:GuzzleHttp\Psr7\Stream:private] => 1 [readable:GuzzleHttp\Psr7\Stream:private] => 1 [writable: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] => File Name is children-wide.jpg [@metadata] => Array ([statusCode] => 200 [effectiveUri] =>https://glacier.region-name.amazonaws.com/-/vaults/vaultname/jobs/gFdjAl4xhTAVEnmffgfg-Ao3-xmmjghfmqkCLOR1m34gHLQpMd0a3WKCiRRrItv2bklawwZnq9KeIch3LKs8suZoJwk2_/output [headers] => Array ([x-amzn-requestid] => NzAiVAfrMQbpSjj-2228iiKWK_VteDwNyFTUR7Kyu0duno [x-amz-sha256-tree-hash] => c176c1843khfullc662f09bb8de916540e6f9dcc9b22020bbb8388de6f81d1c2 [accept-ranges] => bytes [x-amz-archive-description] => File Name is children-wide.jpg [content-type] => application/octet-stream [content-length] => 1452770 [date] => Tue, 31 Jan 2017 03:34:26 GMT [connection] => close) [transferStats] => Array ([http] => Array ([0] => Array ())))))

+0

爲什麼使用'$ result = ...',然後從不真正檢查'$ result'包含的內容?您很可能丟棄了有價值的信息。 –

+0

嗨@ Michael-sqlbot我嘗試不將值存儲到$ result,然後該文件未複製到s3位置。你能詳細解釋一下你的意思嗎?我認爲我所做的事可能是錯的。謝謝您的寶貴回答 –

+0

'$ result = $ this-> glacier-> getJobOutput ...''在這裏找到什麼'$ result'? –

回答

0

當你正在恢復從冰川文件,也不會得到標準作爲存儲類再提到這是完全一樣的。它仍然會顯示冰川。以確定文件是否從冰川下來,

改爲使用GetObject,並查看結果的恢復值。並將Range設置爲「bytes = 0-0」以跳過檢索文件本身的內容。並且一定要捕捉異常

如果對象位於Glacier中且未恢復,AWS將拋出InvalidObjectStateError,並且如果未捕獲到錯誤,腳本將會死亡。

這是你會看到它的項目resored。

["Restore"] => string(68)"ongoing-request="false ", expiry-date=" Thu, 12 Oct 2017 00: 00: 00 GMT ""

這是你會得到什麼,如果項目仍處於冰川

Fatal error: Uncaught exception 'Aws\S3\Exception\S3Exception' with message 'Error executing "GetObject" on "OBJ PATH"; AWS HTTP error: Client error: GET OBJ PATH resulted in a 403 Forbidden response: InvalidObjectStateThe operation is not valid for the (truncated...) InvalidObjectState (client): The operation is not valid for the object's storage class - InvalidObjectStateThe operation is not valid for the object 's storage class879A42BDC3939282VjgBNmLxhqesAaOnnUKkIahdr9OlUnTPASmjh8zZNVzLeYEDz+QooqoFjyaeoyXGeAa/IPxTBrA=' GuzzleHttp\ Exception\ ClientException: Client error: `GET OBJ PATH in C:\inetpub\wwwroot\cruisecheap.com\php_includes\SDKs\AWS\vendor\aws\aws-sdk-php\src\WrappedHttpHandler.php on line 192

我希望這可以幫助你和其他人具有相同的問題。