Amazon S3 未正确提供文件
Posted
技术标签:
【中文标题】Amazon S3 未正确提供文件【英文标题】:Amazon S3 is not serving files correctly 【发布时间】:2011-02-06 18:31:05 【问题描述】:我为我的朋友创建了这个网站,并将其上传到了 Amazon S3 存储桶 (http://ballard26.s3.amazonaws.com/index.html),当我访问该网站时,页面无法正确加载,我不知道为什么。有什么想法吗?
例如,stylesheet.css
无法正确加载。如果您转到http://ballard26.s3.amazonaws.com/stylesheet.css,它会下载文件而不是将其作为 CSS 加载。
【问题讨论】:
您需要告诉我们出了什么问题。您希望看到什么?它与您实际看到的有什么不同? 【参考方案1】:检查您上传的文件的 MIME 类型(HTTP 内容类型标头)。 S3 并不总是正确设置它们。您可能需要在上传 API 调用中设置它们。一些上传库会为您执行此操作。
如果从浏览器从 S3 下载文件时 mime 类型不正确,如果 mime 类型设置不正确,则不会始终正确呈现。
【讨论】:
or ... mime-type 可以是正确的,因为还有一个 content-disposition 标头设置为“attachment” 我快速查看所有标题的好方法是使用 curl。例如: $ curl -I maxcdn.bootstrapcdn.com/bootstrap/3.3.2/css/bootstrap.min.css -- 确保添加 '-I' 以便查看标题而不是文档的内容。【参考方案2】:我猜你在上传文件时没有正确指定或设置文件的 mime-type。因此,它默认为binary/octet-stream
。
当您加载页面时,您的浏览器会假定您指定的样式表不是 CSS 文件,因为它使用的内容类型不是 text/css
,因此不应用样式表。
【讨论】:
【参考方案3】:由于我们的 CSS / JS 文件的内容类型不正确,我在 IE 中遇到了同样的问题。
如果您使用的是 Ruby 和 AWS gem,请使用以下代码:
s3 = Aws::S3Interface.new($s3[:s3_access_key_id],$s3[:s3_secret_access_key],:multi_thread => true);
s3.put($s3[:s3_bucket],s3_path,file[:tempfile].read,'x-amz-acl' => 'public-read', 'content-type' => 'text/css' )
注意 S3 元数据的不同语法:
'content-type' => 'text/css'
【讨论】:
【参考方案4】:CSS 文件默认为octet/binary
的 MIME 类型。要更正此问题,请登录您的 AWS 管理控制台,转到 Amazon S3 部分并找到相关的存储桶。找到 CSS 文件并选择属性。在元数据下,将 Content-Type 键设置为值:text/css
如果您在 Mac OS X 上使用 Panic 的 Transmit 应用程序,您可以为 Content-Type: text/css
的 CSS 文件设置自定义上传标头,这将在您每次上传文件时应用正确的 MIME 类型,无需手动设置每次你的控制台。
有关这方面的更多信息,请参阅 Adam Wilcox 的blog post。
【讨论】:
只是想补充一下,Transmit 的答案是为我解决的问题。一个 CSS 文件由于某种原因触发了八位字节/二进制文件,即使所有其他文件都正确通过,我仍然无法解释。在 Transmit 中强制解决问题挽救了我的臀肌。以上是关于Amazon S3 未正确提供文件的主要内容,如果未能解决你的问题,请参考以下文章
在 Amazon s3 中将 Spark RDD 编写为 Gzipped 文件
如何为 Amazon CloudFront 签署 RTMP URL