AWS SDKを使ってアップロードして、S3からDLするとContent-Typeヘッダが空になっていることがありました。
S3のマネージメントコンソール上からはimage/jpegの設定がされてるように見えたのになぜ・・・?
sample1.rb
require "aws"
s3 = AWS::S3.new
bucket = s3.buckets["my-test-bucket"]
object = bucket.objects["obj-key"]
object.write("test text")
$ curl -i https://s3-ap-northeast-1.amazonaws.com/my-test-bucket/obj-key
HTTP/1.0 200 Connection established
HTTP/1.1 200 OK
Date: Mon, 20 Jan 2014 00:37:31 GMT
Last-Modified: Mon, 20 Jan 2014 00:29:00 GMT
Accept-Ranges: bytes
Content-Type:
Content-Length: 9
Server: AmazonS3
test text
調べてみたところ、S3アップロード時にContent-Typeを指定してやる必要がありました。
S3マネージメントコンソール上でimage/jpegが設定されてるように見えるのは、プルダウンの初期値が見えてるだけで設定されているわけではありませんでした。
AWS SDK for RubyでContent-Typeヘッダを設定するには以下のような感じでやります。
sample2.rb
require "aws"
s3 = AWS::S3.new
bucket = s3.buckets["my-test-bucket"]
object = bucket.objects["obj-key2"]
object.write("test text", content_type: "text/plain")
$ curl -i https://s3-ap-northeast-1.amazonaws.com/my-test-bucket/obj-key2
HTTP/1.0 200 Connection established
HTTP/1.1 200 OK
Date: Mon, 20 Jan 2014 00:49:13 GMT
Last-Modified: Mon, 20 Jan 2014 00:48:50 GMT
Accept-Ranges: bytes
Content-Type: text/plain
Content-Length: 9
Server: AmazonS3
test text
ちなみに、既にアップロード済みのファイルにContent-Typeヘッダを付けるなら#copy_fromを使えばOKでした。
sample3.rb
require "aws"
s3 = AWS::S3.new
bucket = s3.buckets["my-test-bucket"]
object = bucket.objects["obj-key3"]
object.exists? #=> true
object.head.to_h[:content_type] #=> ""
object.copy_from(object, content_type:"text/plain")
object.head.to_h[:content_type] #=> "text/plain"