s3 存储桶中的 utf-8 文件名

208*_*083 3 python amazon-s3 boto

是否可以使用 utf-8 编码名称(如“åøæ.jpg”)向 s3 添加密钥?

使用 boto 上传时出现以下错误:

<Error><Code>InvalidURI</Code><Message>Couldn't parse the specified URI.</Message>
Run Code Online (Sandbox Code Playgroud)

Joã*_*nes 5

@2083:这是一个老问题,但是如果您还没有找到解决方案,并且对于像我一样来到这里寻找答案的其他人:

从官方文档(http://docs.aws.amazon.com/AmazonS3/latest/dev/UsingMetadata.html):

虽然您可以在对象键名称中使用任何 UTF-8 字符,但以下键命名最佳实践有助于确保与其他应用程序的最大兼容性。每个应用程序可能会以不同的方式解析特殊字符。以下指南可帮助您最大限度地遵守 DNS、网络安全字符、XML 解析器和其他 API。

安全字符

以下字符集在键名中使用通常是安全的:

字母数字字符 [0-9a-zA-Z]

特殊字符 !, -, _, ., *, ', (, and )

以下是有效对象键名称的示例:

4我的组织

my.great_photos-2014/jan/myvacation.jpg

视频/2014/生日/video1.wmv

但是,如果您像我一样真正想要的是允许使用 UTF-8 字符的文件名(请注意,这可能与键名不同)。你有办法做到的!

来自http://www.bennadel.com/blog/2591-embedding-foreign-characters-in-your-content-disposition-filename-header.htmhttp://www.bennadel.com/blog/2696-overriding -content-type-and-content-disposition-headers-in-amazon-s3-pre-signed-urls.htm(向 Ben Nadal致敬)您可以通过确保在下载文件时 S3 将覆盖内容来做到这一点-处置标题。

正如我在 java 中所做的那样,我在此处包含了代码,我相信您将能够轻松地将其转换为 Python :):

      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);
Run Code Online (Sandbox Code Playgroud)

它应该有帮助:)