3

わかりましたので、S3 アカウントにアップロードするファイルを取得する方法をいくつか試しました。最後に、自分がどこかに到達し、ブームになっていることに気付きました-紛らわしいドキュメントと、矛盾しているように見える奇妙なエラーメッセージ。

わかりました、私はcomposerなどを使用していません。私はこれを昔ながらの方法で行っています:

require '/path/to/aws-autoload.php';

これで正しくロードされるようになりました。Autoload をトリミングして Common クラスと S3 クラスのみを使用するようにしました。すべては必要ありません。

次に、S3 クライアントと資格情報をロードします。

use Aws\S3\S3Client;
use Aws\Common\Credentials\Credentials;

魔法の出来事を開始するコードは次のとおりです。

$file = '/path/to/' . $filename;
$credentials = new Credentials('KEY', 'SECRET KEY');
$s3 = S3Client::factory(array('credentials' => $credentials));

try{
$s3->putObject(array(
    'Bucket' => 'sub.domain.com.s3.amazonaws.com',
    'Body'   => fopen($file, 'r'),
    'ACL'    => 'public-read',
));
} catch (S3Exception $e) {
     $result = array(
         'ok' => false,
         'descr' => 'There was an error uploading the file to S3 : ' . $filename
     );
}

私が抱えていると思われる問題は、「バケット」自体にあります。

バケットをsub.domain.comとしてフォーマットすると、AWS API から次のメッセージが返されます。

AWS エラー メッセージ: アクセスしようとしているバケットは、指定されたエンドポイントを使用してアドレス指定する必要があります。今後のすべてのリクエストをこのエンドポイント「sub.domain.com.s3.amazonaws.com」に送信してください。

「バケット」を上記のように変更すると、次のようになります:sub.domain.com.s3.amazonaws.com

次のエラー メッセージが表示されます。

AWS エラー メッセージ: 指定されたバケットは存在しません

私は何か間違ったことをしていますか?何か不足していますか?残念ながら、AWS のドキュメントは十分に整っていません。現時点では、API 自体が矛盾しているようです。すべてのキーが正しく、すべての権限が正しいことを知っています。独自のアドバイスから、301 - Redirect to 404 - Not Found になりました。

ヘルプ/アドバイスをいただければ幸いです。ここでちょっとぐるぐるしてる感じ!

4

1 に答える 1

4

再確認すべき点がいくつかあります。

  1. バケットが特定のリージョン (例: us-west-2) で作成された場合、S3Clientそのリージョンで をインスタンス化します[..., 'region' => 'us-west-2', ...]
  2. パラメータは、'Bucket'バケットの名前とまったく同じに設定する必要があります (たとえば、バケットの名前が「sub.domain.com」の場合、'Bucket'パラメータは に設定する必要があります'sub.domain.com')。パラメータにリージョンまたは「s3.amazonaws.com」を含めないで'Bucket'ください (つまり、bucket != endpoint)。SDK は、(クライアントのリージョンと指定されたバケット名に基づいて) エンドポイントを自動的に決定し、必要に応じてパス スタイルの URL を調整します。
  3. PutObject操作にはパラメーターが必要です'Key'が、上記のコード サンプルにはありません。
于 2014-10-07T18:34:09.663 に答える