Python s3存储桶中的utf-8文件名
是否可以使用utf-8编码名称(如“åøæ.jpg”)向s3添加密钥 使用boto上载时出现以下错误:Python s3存储桶中的utf-8文件名,python,amazon-s3,boto,Python,Amazon S3,Boto,是否可以使用utf-8编码名称(如“åøæ.jpg”)向s3添加密钥 使用boto上载时出现以下错误: <Error><Code>InvalidURI</Code><Message>Couldn't parse the specified URI.</Message> 来自AWS常见问题: 密钥是一个Unicode字符序列,其UTF-8编码长度最多为1024字节 根据我的经验,请使用ASCII。@2083:这是一个有点老掉牙的问题,但
<Error><Code>InvalidURI</Code><Message>Couldn't parse the specified URI.</Message>
来自AWS常见问题:
密钥是一个Unicode字符序列,其UTF-8编码长度最多为1024字节
根据我的经验,请使用ASCII。@2083:这是一个有点老掉牙的问题,但如果您还没有找到解决方案,对于像我这样来这里寻找答案的其他人: 从官方文件()中: 虽然可以在对象键名称中使用任何UTF-8字符,但 以下关键命名最佳实践有助于确保最大的兼容性 与其他应用程序一起使用。每个应用程序都可以解析特殊的 角色不同。以下指导原则可帮助您最大限度地提高效率 遵守DNS、web安全字符、XML解析器和其他API 安全字符 以下字符集通常可以安全地用于密钥名: 字母数字字符[0-9a-zA-Z] 特殊字符!,-,_,,*,',(及) 以下是有效对象键名称的示例: 4my组织 my.great_photos-2014/jan/myvacation.jpg 视频/2014/生日/视频1.wmv 但是,如果您像我一样真正想要的是一个允许UTF-8字符的文件名(请注意,这可能与键名不同)。你有办法做到的 从和(Ben Nadal的荣誉)您可以通过确保在下载文件时,S3将覆盖内容配置头来实现这一点 正如我在java中所做的那样,我在这里包含了代码,我相信您将能够轻松地将其转换为Python:):
这应该会有帮助:)我得到了签名失败验证,因为我和content disposition中的文件名使用的是PHP SDK(v3),但是content disposition是由我定义的,SDK没有更正。非常感谢。
AmazonS3 s3 = S3Controller.getS3Client();
//as per http://docs.aws.amazon.com/AmazonS3/latest/dev/UsingMetadata.html
String key = fileName.substring(fileName.indexOf("-")).replaceAll("[^a-zA-Z0-9._]", "");
PutObjectRequest putObjectRequest = new PutObjectRequest(
S3Controller.bucketNameForBucket(S3Controller.Bucket.EXPORT_BUCKET),
key,
file);
// we can always regenerate these files, so we can used reduced redundancy storage
putObjectRequest.setStorageClass(StorageClass.Standard);
String urlEncodedUTF8Filename = key;
try {
//http://www.bennadel.com/blog/2696-overriding-content-type-and-content-disposition-headers-in-amazon-s3-pre-signed-urls.htm
//http://www.bennadel.com/blog/2591-embedding-foreign-characters-in-your-content-disposition-filename-header.htm
//Issue#179
urlEncodedUTF8Filename = URLEncoder.encode(fileName.substring(fileName.indexOf("-")), "UTF-8");
} catch (UnsupportedEncodingException e) {
LOG.warn("Could not URLEncode a filename. Original Filename: " + fileName, e );
}
ObjectMetadata metadata = new ObjectMetadata();
metadata.setContentDisposition("attachment; filename=\"" + key + "\"; filename*=UTF-8''"+ urlEncodedUTF8Filename);
putObjectRequest.setMetadata(metadata);
s3.putObject(putObjectRequest);