2017-10-13 8 views
0

JS-FrontendからAmazon S3にファイルをアップロードしました。 Rubyにaws-sdk-s3を使用すると、オブジェクトを別のバケットに移動しようとします。私はこのためにAws::S3::Client#copy_objectを使用しています。Amazon S3 copy_objectキーが見つかりません - エンコーディングの問題?

テストの目的で、{}?^°!#*äÄÜ?=)(;:- &%$§%2! |<>.jpgという名前のファイルをアップロードしました。特別な文字を含まないファイルはすべて動作しますが、このファイルを移動するとAws::S3::Errors::InvalidArgument Exception: Unsupported copy source parameterというエラーが発生します。

ファイルがその名前で私のS3-Bucketに存在することを確認しました。オブジェクトキーをさまざまな方法でエンコーディング(CGI.escape、URI.escape、URI.encode)しても役に立ちませんでした。

スニペットは次のようになります。

s3 = Aws::S3::Client.new(region: ENV['AWS_REGION']) 
    source_key = "{}?^°!#*äÄÜ?=)(;:- &%$§%2! |<>.jpg" 
    s3.copy_object({ copy_source: 'mybucket1/' + source_key, 
        bucket:  'mybucket2', 
        key:   'new_file_name.jpg' }) 

誰もがコピー元が見つからない理由を考えて、持っていますか?キーに禁止された文字が含まれているのですか、違う文字をエンコードする必要がありますか?

+0

私は1つのことに同意しなければなりません。これは私が見たs3オブジェクトに与えられた最も奇妙な名前です:-D。 –

+0

エラーは、ソースオブジェクトが見つからないとは限りません。議論は「無効」であり、「サポートされていない」と述べている。存在しない単純な(つまり英数字のASCIIのみの)ソースオブジェクトキーを使用して、エラー応答の内容を確認しましたか? –

+0

ああ、そうです。 NoSuchKeyは、存在しないキーのエラーです。 – Stephan

答えて

0

S3に送信する前に、すべての特殊文字を置き換えることをお勧めします。

最初の行はファイル拡張子なしのsource_key名です(.jpg)。 2行目は、任意の特殊文字をアクセントなしの最も近い文字に変換します(à - > a、é - > eなど)。 3行目は[a-zA-Z]の範囲にない文字を '_'に変換します。最後の行にファイル拡張子が追加されます。

0

字幕はトリックではありませんでした。 フォーム提出でファイル名がエンコードされているので、?%+などの特殊文字がエスケープされていました。私はキー上でURI.decodeを実行し、aws-sdk-rubyのAws::Sigv4::Signer.uri_escape(string)を使って再エンコードしなければなりませんでした。 Amazonは違ったエンコーディングをしています。 uri_escapeの出典をご覧ください:

def uri_escape(string) 
    CGI.escape(string.encode('UTF-8')).gsub('+', '%20').gsub('%7E', '~') 
end 
関連する問題