2015-09-10 5 views
0

Я пытаюсь получить предварительно подписанный URL к объекту Amazon S3 с помощью AWS \ S3 \ S3Client :: createPresignedRequest() метод:Amazon S3 Pre-Signed URL (AWS версия 3)

$s3 = new S3Client($config); 

$command = $s3->getCommand('GetObject', array(
     'Bucket'      => $bucket, 
     'Key'      => $key, 
'ResponseContentDisposition'=>'attachment; filename="' . $fileName . '"', 
      )); 

$request = $s3->createPresignedRequest($command, $time); 

      // Get the actual presigned-url 
$this->signedUrl = (string)$request->getUri(); 

Я получаю presigned-URL, как это:

https://s3.amazonaws.com/img/1c9a149e-57bc-11e5-9347-58743fdfa18a?X-Amz-Content-Sha256=e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=13JZVPMFV04D8A3AQPG2%2F20150910%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20150910T181455Z&X-Amz-SignedHeaders=Host&X-Amz-Expires=1200&X-Amz-Signature=0d99ae98ea13e2974322575f95f5a19e94e13dc859b2509cecc21cd41c01c65d 

and this url returned error: 

<Error> 
<Code>NoSuchKey</Code> 
<Message>The specified key does not exist.</Message> 
.... 
+1

Этот файл отсутствует. Не существует проверки того, существует ли объект, когда создается подписанный URL-адрес. Кроме того, это ведро не настроено безопасно, и ваш список объектов общедоступен. Вероятно, вы должны удалить разрешение s3: ListObjects из политики вашего вектора. –

+0

Я не понимаю, почему он не работает для aws версии 3, и он работает правильно для одного и того же объекта, когда я использую aws-версию 2, например: $ s3 = S3Client :: factory ($ config); $ command = $ s3-> getCommand ('GetObject', array ( 'Bucket' => $ originalBucket, 'Key' => $ key, 'ResponseContentDisposition' => 'attachment; filename = "'. $ FileN . '' ' )); $ this-> signedUrl = $ command-> createPresignedUrl ($ time); –

+0

Вы прочитали мой предыдущий комментарий? Если ваш ведро называется «img», то этот файл не находится в вашем ковше. Если ваше ведро называется чем-то другим, попробуйте объяснить, почему имя корзины не отображается в URL-адресе. –

ответ

1

Генерация presigned URL выполняется полностью на стороне клиента, без взаимодействия с API для сервиса S3. Таким образом, нет подтверждения того, что объект существует на момент создания предварительно подписанного URL. (Предварительно подписанный URL-адрес может быть технически даже создан до того, как объект будет загружен).

NoSuchKey Ошибка означает, что точно - нет такой объект с указанным ключом в ведре, где ключ, в S3 языке, относится к пути + имени файла (URI,) объекта. (Он называется ключ, как в терминах ключ/ценность - который S3 - путь к объекту - это «ключ», а тело объекта/полезная нагрузка - это «значение»).

http://docs.aws.amazon.com/AmazonS3/latest/dev/UsingObjects.html

Смежные вопросы