3

我正在使用带有 Paperclip 4.1.1 的 Rails 4.0.0 来附加 mp3 和 pdf 文件。我正在使用 Capybara 在 Rspec 中编写集成测试。

我对这两种类型的文件都有内容类型和文件名验证。

class Song < ActiveRecord::Base
  validates :title, presence: true
  validates :writeup, presence: true

  has_attached_file :mp3
  validates_attachment :mp3,
    :content_type => { :content_type => "audio/mp3" },
    :file_name => { :matches => [/mp3\Z/] }

  has_attached_file :chords
  validates_attachment :chords,
    :content_type => { :content_type => 'application/pdf' },
    :file_name => { :matches => [/pdf\Z/] }

end

我在集成测试中使用它来填写有效歌曲的属性:

def fill_in_valid_song
    fill_in("Title", with: "Valid Song")
    fill_in("Writeup", with: "Description of song")
    attach_file("Mp3", File.join(Rails.root, "/spec/factories/Amazing_Grace.mp3" ))
    attach_file("Chords", File.join(Rails.root, "/spec/factories/FakeChordChart.pdf" ))
  end

当我运行集成测试以创建有效歌曲时,接受 pdf 文件,但 mp3 文件未通过内容类型验证。

当我自己在浏览器中按照相同的步骤操作时,歌曲上传成功且没有错误。模型规范也使用相同的文件通过。

当我附加文件时,我认为问题可能是“Mp3”中的大写“M”,但这只是为了指定附件附带的文件字段。当我尝试将其更改为小写“m”时,错误变为 Capybara 无法找到该字段。

4

1 回答 1

4

将 mp3 文件的内容类型验证更改为:

validates_attachment :mp3,
    :content_type => { :content_type => ["audio/mpeg", "audio/mp3"] },
    :file_name => { :matches => [/mp3\Z/] }

RFC为 mp3 文件定义的MIME 类型是audio/mpeg. 然而,有些浏览器会加载它们,audio/mp3这可能就是它通过浏览器工作的原因。

如果这不起作用,您还可以添加audio/mpeg3,并且audio/x-mpeg-3我也看到这些使用过。

于 2014-04-07T08:24:06.203 回答