我有两个AWC帐户,每个帐户都有一个S3桶。我向每个.CSV桶上传了两个相同大小的S3文件。
当我尝试以下载或下载为时,该文件将在第一个帐户中作为.CSV文件下载。但是(!)当我尝试从第二个帐户下载这个文件时,它是以.TXT的形式下载的。
怎么会发生这种事?这两个文件都是以相同的方式创建的:通过Redshift卸载查询,执行从Redshift到S3的选定数据的复制。
UPDATE:可能是因为在这个文档的帐户中,**服务器端加密等于AWS?我注意到从.csv转换为.txt的文件具有“服务器端加密: AWS-KMS",而下载为.csv的.csv文件具有”服务器端加密:无“
更新:在不同的浏览器中尝试-相同的结果

发布于 2018-02-22 17:40:59
检查AWS S3控制台中每个对象的标头,并比较内容类型值。Content-Type向web浏览器提供了关于对象包含哪些数据的提示。
如果Content-Type不存在或不包含text/csv,则在S3控制台或通过您喜爱的S3应用程序(如CloudBerry )中添加或修改标头。
发布于 2018-02-22 19:03:21
约翰说的Content-Type不是text/csv是对的。有时候,S3会把它做对了,有时它不会。如果你自己不能手动纠正这个错误,你可以运行一个Lambda函数来帮你每次上传一个新的对象。您可以使用Python2.7模板Lambda函数从桶中下载对象,为S3对象使用mimetypes库到guess_type,然后在同一个桶中重新上传文件。您需要通过S3对象上传触发这个函数,并给予它必要的权限(S3:GetObject)。
P.S. --这将适用于任何扩展名的文件。如果您知道只打算上载.csv文件,则可以忽略mimetype并直接将对象重新上传到
bucket.upload_fileobj(filename, key, ExtraArgs={'ContentType': 'text/csv'})如果mimetype无法猜测类型,那么您可能需要添加这些类型,请看下面的示例type
祝好运!
发布于 2020-12-23 14:35:23
下面是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)https://stackoverflow.com/questions/48932708
复制相似问题