AWS S3:.csv文件以.csv格式下载

时间:2018-02-22 16:38:58

标签: amazon-web-services amazon-s3 amazon-redshift

我有2个AWC帐户,每个帐户都有一个S3存储桶。我向每个S3存储桶上传了两个相同大小的.CSV文件。

当我尝试下载下载为时,此文件将作为.CSV文件下载到第一个帐户中。但是(!!)当我尝试从第二个帐户下载此文件时 - 它将下载为.TXT。

这怎么可能发生?这两个文件都以相同的方式创建:通过Redshift UNLOAD查询,执行将所选数据从Redshift复制到S3。

更新是否可以因为在本帐户的此帐户中,**服务器端加密等于AWS-KMS? 我注意到从.csv转换为.txt的文件具有“服务器端加密:AWS-KMS”,而.csv下载的.csv文件具有“服务器端加密:无”

更新:尝试在不同的浏览器中使用 - 结果相同

enter image description here

3 个答案:

答案 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)