我将文件从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' })
有没有人有想法,为什么找不到复制源?密钥是否包含禁用字符,还是必须以不同方式编码?
答案 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]范围内的字符。最后一行添加了文件扩展名。