paperclip gem中的@content_type返回不同​​的值

时间:2016-01-08 07:15:48

标签: ruby-on-rails ruby-on-rails-3 paperclip

在Windows中,我得到:

@content_type="application/octet-stream"

完整追踪:

"attachments_attributes"=>{"0"=>{"attachment"=>#<ActionDispatch::Http::UploadedFile:0x007f7bb52becc8 @original_filename="ms_document.doc", @content_type="application/octet-stream", @headers="Content-Disposition: form-data; name=\"post[attachments_attributes][0][attachment]\"; filename=\"doc\"\r\nContent-Type: application/octet-stream\r\n", @tempfile=#<Tempfile:/tmp/RackMultipart20160108-8859-x51qhj>>}}}

在Linux中我得到:

@content_type="application/msword"

完整追踪:

"attachments_attributes"=>{"0"=>{"attachment"=>#<ActionDispatch::Http::UploadedFile:0x007f7bb5d585d0 @original_filename="ms_document.doc", @content_type="application/msword", @headers="Content-Disposition: form-data; name=\"post[attachments_attributes][0][attachment]\"; filename=\"doc.doc\"\r\nContent-Type: application/msword\r\n", @tempfile=#<Tempfile:/tmp/RackMultipart20160108-8859-9m1xgv>>}}}

问题是,为什么我在上传同一个文件但只上传不同的操作系统时收到了不同的@content_type。

我正在使用:

  1. rails 3
  2. paperclip&#39; 4.3.2&#39;

1 个答案:

答案 0 :(得分:1)

HTTP规范here声明

  

当实体主体包含在消息中时,该主体的数据类型通过标题字段Content-Type和Content-Encoding确定。这些定义了一个两层有序编码模型:

     

entity-body:= Content-Encoding(Content-Type(data))Content-Type   指定基础数据的媒体类型。内容编码可以   用于表示适用于的任何其他内容编码   数据,通常用于数据压缩,属于属性   请求的资源。没有默认编码。

     

包含实体主体的任何HTTP / 1.1消息应该包含一个   Content-Type标头字段,用于定义该主体的媒体类型。如果和   仅当Content-Type字段未给出媒体类型时,   收件人可以尝试通过检查媒体类型来猜测媒体类型   用于标识的URI的内容和/或名称扩展名   资源。如果媒体类型仍然未知,则收件人应该   将其视为类型&#34; application / octet-stream&#34;。

在您的情况下,这可能已经发生,因为发送/上传文件的服务器无法确定文件类型,因为浏览器可能没有在HTTP中设置Content-Type发送文件时的消息。

这取决于您使用的浏览器和操作系统。 Windows上的浏览器可能没有设置内容类型。