지금까지 이틀 넘게 웹에서 검색했으며 온라인 문서화 된 시나리오와 해결 방법의 대부분을 살펴 봤지만 지금까지 아무런 효과가 없었습니다.
저는 PHP 5.3에서 실행되는 PHP V2.8.7 용 AWS SDK 를 사용하고 있습니다.
다음 코드를 사용하여 S3 버킷에 연결하려고합니다.
// Create a `Aws` object using a configuration file
$aws = Aws::factory('config.php');
// Get the client from the service locator by namespace
$s3Client = $aws->get('s3');
$bucket = "xxx";
$keyname = "xxx";
try {
$result = $s3Client->putObject(array(
'Bucket' => $bucket,
'Key' => $keyname,
'Body' => 'Hello World!'
));
$file_error = false;
} catch (Exception $e) {
$file_error = true;
echo $e->getMessage();
die();
}
//
내 config.php 파일은 다음과 같습니다.
<?php
return array(
// Bootstrap the configuration file with AWS specific features
'includes' => array('_aws'),
'services' => array(
// All AWS clients extend from 'default_settings'. Here we are
// overriding 'default_settings' with our default credentials and
// providing a default region setting.
'default_settings' => array(
'params' => array(
'credentials' => array(
'key' => 'key',
'secret' => 'secret'
)
)
)
)
);
다음 오류가 발생합니다.
계산 한 요청 서명이 제공 한 서명과 일치하지 않습니다. 키 및 서명 방법을 확인하십시오.
이미 내 액세스 키와 암호를 20 번 이상 확인하고 새 암호를 생성하고 다른 방법을 사용하여 정보 (예 : 프로필 및 코드에 자격 증명 포함)를 전달했지만 현재 아무 것도 작동하지 않습니다.
답변
이틀간의 디버깅 끝에 마침내 문제를 발견했습니다.
객체에 할당 한 키는 마침표 즉 ..\images\ABC.jpg
, 이로 인해 오류가 발생했습니다.
API가 더 의미 있고 관련성있는 오류 메시지를 제공하기를 바랍니다. 아아, 이것이 다른 사람에게 도움이되기를 바랍니다.
답변
잘못된 자격 증명으로이 오류가 발생합니다. 원래 붙였을 때 보이지 않는 캐릭터가 있었던 것 같아요.
답변
일부 UTF8 문자로 객체를 복사하려고 할 때 동일한 문제가 발생했습니다. 다음은 JS 예입니다.
var s3 = new AWS.S3();
s3.copyObject({
Bucket: 'somebucket',
CopySource: 'path/to/Weird_file_name_ðÓpíu.jpg',
Key: 'destination/key.jpg',
ACL: 'authenticated-read'
}, cb);
CopySource를 다음으로 인코딩하여 해결 encodeURIComponent()
답변
이 오류는 주로 비밀 키 앞뒤에 공백이있는 경우 발생하는 것 같습니다.
답변
실제로 Java에서 동일한 오류가 발생했습니다. 디버그하는 데 4 시간을 소비 한 후 S3 파일에 캐시 컨트롤을 배치하는 동안 공간이 있었기 때문에 S3 객체의 메타 데이터에 문제가 있음을 발견했습니다.이 공간은 1.6. *에서 허용되었습니다. 버전이지만 1.11. *에서는 허용되지 않으므로 서명 불일치 오류가 발생했습니다.
답변
언급 된 다른 솔루션 중 어느 것도 효과가 없으면 다음을 사용해보십시오.
aws configure
이 명령 은 키, 지역 및 출력 형식을 묻는 옵션 세트를 엽니 다.
도움이 되었기를 바랍니다!
답변
나를 위해 나는 axios를 사용했고 귀머거리로 헤더를 보냅니다.
content-type: application/x-www-form-urlencoded
그래서 나는 보내기 위해 변경합니다.
content-type: application/octet-stream
또한이 Content-Type을 AWS 서명에 추가해야했습니다.
const params = {
Bucket: bucket,
Key: key,
Expires: expires,
ContentType = 'application/octet-stream'
}
const s3 = new AWS.S3()
s3.getSignedUrl('putObject', params)