getObjectとかlistObjectは特に問題なく動作しているのに、CopyObjectの時だけ署名エラーがでる。
SignatureDoesNotMatch
はい。 色々検証してみた結果、CopySourceの項目に日本語が使われているとエラーになるようだ。 Keyには使用しても問題ない。
仕方ないので以下のようにしてエラーを回避することにした。
<?php $info = pathinfo($content['Key']); // listObjectとかで取ってきたデータだと思いねぇ $s3client->copyObject([ 'Bucket' => $bucket, 'Key' => $key, 'CopySource' => $bucket . '/' . $info['dirname'] . '/' . rawurlencode($info['filename']) . '.' . $info['extension'], ]);
はい。日本語が使われているファイル名の部分だけURLエンコードしておけばとりあえず大丈夫。
IAMとかでS3のarnを指定するときも同じようにURLエンコードすればイケるかと思ったけどダメだった。 日本語を使わない方が健全な気もするけど、そうも行かないのが悲しいところですよね。 終わり。