<p>@2083:这是一个有点老的问题,但是如果你还没有找到解决办法,对于像我这样来这里寻找答案的人来说:</p>
<p>根据官方文件(<a href="http://docs.aws.amazon.com/AmazonS3/latest/dev/UsingMetadata.html" rel="nofollow">http://docs.aws.amazon.com/AmazonS3/latest/dev/UsingMetadata.html</a>):</p>
<blockquote>
<p>Although you can use any UTF-8 characters in an object key name, the
following key naming best practices help ensure maximum compatibility
with other applications. Each application may parse special
characters differently. The following guidelines help you maximize
compliance with DNS, web safe characters, XML parsers, and other APIs.</p>
<p>Safe Characters</p>
<p>The following character sets are generally safe for use in key names:</p>
<p>Alphanumeric characters [0-9a-zA-Z]</p>
<p>Special characters !, -, _, ., *, ', (, and )</p>
<p>The following are examples of valid object key names:</p>
<p>4my-organization</p>
<p>my.great_photos-2014/jan/myvacation.jpg</p>
<p>videos/2014/birthday/video1.wmv</p>
</blockquote>
<p><strong>但是</strong>如果您真正想要的是允许UTF-8字符的<strong>文件名</strong>(请注意,这可能与密钥名不同)。你有办法做到的!在</p>
<p>从<a href="http://www.bennadel.com/blog/2591-embedding-foreign-characters-in-your-content-disposition-filename-header.htm" rel="nofollow">http://www.bennadel.com/blog/2591-embedding-foreign-characters-in-your-content-disposition-filename-header.htm</a>和<a href="http://www.bennadel.com/blog/2696-overriding-content-type-and-content-disposition-headers-in-amazon-s3-pre-signed-urls.htm" rel="nofollow">http://www.bennadel.com/blog/2696-overriding-content-type-and-content-disposition-headers-in-amazon-s3-pre-signed-urls.htm</a>(向Ben Nadal致敬),您可以确保在下载文件时,S3将覆盖<strong>内容处理</strong>头。在</p>
<p>正如我在java中所做的,我在这里包含了代码,我相信您将能够轻松地将其转换为Python:):</p>
<pre><code> 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);
</code></pre>
<p>它应该有帮助:)</p>