Ruby
AWS_SDK

AWS SDK for RubyでアップロードしたS3オブジェクトからContent-Typeヘッダが取れない

More than 5 years have passed since last update.

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"