我有2个AWC帐户,每个帐户都有一个S3存储桶。我向每个S3存储桶上传了两个相同大小的.CSV文件。
当我尝试下载或下载为时,此文件将作为.CSV文件下载到第一个帐户中。但是(!!)当我尝试从第二个帐户下载此文件时 - 它将下载为.TXT。
这怎么可能发生?这两个文件都以相同的方式创建:通过Redshift UNLOAD查询,执行将所选数据从Redshift复制到S3。
更新: 是否可以因为在本帐户的此帐户中,**服务器端加密等于AWS-KMS? 我注意到从.csv转换为.txt的文件具有“服务器端加密:AWS-KMS”,而.csv下载的.csv文件具有“服务器端加密:无”
更新:尝试在不同的浏览器中使用 - 结果相同
答案 0 :(得分:3)
检查AWS S3控制台中每个对象的标头,并比较Content-Type值。 Content-Type
向Web浏览器提供有关对象包含的数据的提示。
如果Content-Type
不存在或者不包含text/csv
,请在S3控制台中添加或修改标题,或者通过您喜欢的S3应用程序(如CloudBerry)添加或修改标题。
答案 1 :(得分:0)
John对于Content-Type
不是text/csv
是正确的。有时候,S3会把它弄好,有时却不会。如果您无法自己手动更正此问题,则每次上传新对象时都可以运行 Lambda 功能为您执行此操作。您可以使用Python 2.7模板 Lambda 函数从存储桶中下载对象,将mimetypes
库用于guess_type
以获取S3对象,然后重新上传该文件同一桶。您需要使用S3对象上传来触发此功能,并为其提供必要的权限(S3:GetObject)。
P.S。这适用于任何扩展程序的文件。如果您知道自己只会上传.csv
个文件,则可以忽略 mimetypes 并直接重新上传
bucket.upload_fileobj(filename, key, ExtraArgs={'ContentType': 'text/csv'})
如果 mimetypes 无法猜出您可能需要添加类型的类型,请查看此处的示例https://www.programcreek.com/python/example/5209/mimetypes.add_type
祝你好运!
答案 2 :(得分:0)
这是 scala
解决方案(指定内容类型):
val settingsLine: String = "csvdata1,csvdata2,csvdata3"
val settingsStream: InputStream = new ByteArrayInputStream(settingsLine.getBytes())
val metadata: ObjectMetadata = new ObjectMetadata()
metadata.setContentType("text/csv")
s3Client.putObject(bucketName, prefix, settingsStream, metadata)