file_field上传的rails content-type不正确

Joe*_*lio 9 pdf content-type ruby-on-rails ruby-on-rails-3

我们使用系统中的rails helper为pdf文档上传文件file_field.我们从rails 2开始,现在使用rails 3大约一年.

查看我们的数据库,pdf content/type到处都是.

我的理解是应该永远 application/pdf

但这是我们收到的类型列表:

application/x-octetstream
application/octet
application/x-download
binary/octet-stream
text/html
application/application/pdf
application/download
application/x-download
text/javascript
text/html
text/csv
Run Code Online (Sandbox Code Playgroud)

我现在可以看到正确设置内容类型的唯一工作是检查文件体(类似这样)

 if (upload_doc_name_ext == "pdf") && (incoming_file.content_type != "application/pdf") && (incoming_file[0..10].match(/%PDF-/) != nil)
    incoming_file.content_type = 'application/pdf'
 end
Run Code Online (Sandbox Code Playgroud)

还有其他想法吗?这是正常的,还有其他奇怪的事吗?浏览器的行为是否正常?

swi*_*osz 2

默认情况下,rails form helper:file_field允许上传所有 MIME 文件类型,因此这就是您拥有上面列出的所有文件类型的原因。

在rails中,如果您使用file_field_tagform.file_field,您可以使用accept选项指定mime/content_type并列出用户可以上传的所有类型。

:accept- 如果设置为一种或多种 MIME 类型,则在选择文件时将建议用户使用过滤器。您仍然需要设置模型验证。

来源:

http://api.rubyonrails.org/classes/ActionView/Helpers/FormHelper.html#method-i-file_field

无论如何,我建议使用回形针 gem并指定content_type验证。

class ActiveRecord::Base
  has_attached_file :document
  # Validate content type
  validates_attachment_content_type :document, :content_type => /\Aapplication\/pdf/
end
Run Code Online (Sandbox Code Playgroud)

Paperclip 更容易使用和管理上传的文件类型,它允许调整许多上传选项,所以如果您将应用程序更新到 Rails 3,这对您来说将是一个很好的解决方案。

如果有帮助就投票。

  • 我认为这会让事情变得更糟,不确定你是否理解我的问题,但实际的 pdf 正在与生产中的其他内容类型一起出现。如果我在 content_type 上进行验证,那么它将拒绝用户上传 pdf。谢谢,我知道回形针 gem,但我认为这个问题与 html/浏览器如何将文件发送到 Rails 有关。 (5认同)