未找到Amazon S3 copy_object键 - 编码问题?

时间:2017-10-13 10:20:18

标签: ruby-on-rails ruby amazon-web-services amazon-s3

我将文件从JS-Frontend上传到Amazon S3。使用aws-sdk-s3 for Ruby我尝试将对象移动到另一个桶。我正在使用Aws::S3::Client#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' })

有没有人有想法,为什么找不到复制源?密钥是否包含禁用字符,还是必须以不同方式编码?

2 个答案:

答案 0 :(得分:1)

音译不是诀窍。我最终自己弄清楚了: 存在两个问题:对于表单提交,文件名已被编码,因此转义了import UIKit import SafariServices let url = URL(string: "https://www.google.com") let vc = SFSafariViewController(url: url!) present(vc, animated: true, completion: nil) ?%等特殊字符。我必须对密钥执行+,然后使用aws-sdk-ruby的URI.decode对其进行重新编码。亚马逊确实进行了不同的编码,这就是事情搞砸的原因。看一下Aws::Sigv4::Signer.uri_escape(string)的来源:

uri_escape

答案 1 :(得分:0)

我建议您在发送到S3之前替换所有特殊字符。

source_key = "{}?^°!#*äÄÜ?=)(;:- &%$§%2!  |<>" 
source_key = I18n.transliterate(source_key)
source_key.gsub! /\W/, '_'
source_key += '.jpg'

第一行是没有文件扩展名(.jpg)的source_key名称。第二行将任何特殊字符转换为最接近的字符,不带重音(à - &gt; a,é - &gt; e等)。第三行转换为'_'任何不在[a-zA-Z]范围内的字符。最后一行添加了文件扩展名。