在UploadedFile.read之后,Ruby on Rails上传文件的长度会减少

时间:2011-02-25 03:11:23

标签: ruby-on-rails file-upload

在我继承的RoR应用上,测试失败涉及文件上传。失败的断言看起来像是这样:

assert_equal File.size("#{RAILS_ROOT}/test/fixtures/#{filename}"), @candidate.picture.length

失败(测试文件为69字节):

<69> expected but was <5>.

这是在发布帖子后使用:

fixture_file_upload(filename, content_type, :binary)

在候选模型中,上传的文件被分配给一个属性,然后将其保存到MySQL中的mediumblob中。在我看来,上传的文件是69个字节,但在将其分配给model属性(使用UploadedFile.read)之后,长度仅显示为5个字节。

所以这段代码:

puts "file.length=" + file.length.to_s
self.picture = file.read
puts "self.picture.length=" + self.picture.length.to_s

导致此输出:

file.length=69
self.picture.length=5

我有点不知道为什么会这样,有什么想法吗?

1 个答案:

答案 0 :(得分:0)

这归结为Windows / Ruby特性,其中读取文件似乎是在文本模式下发生的。 test_helper中有一个扩展程序,如:

class ActionController::TestUploadedFile
  # Akward but neccessary for testing since an ActionController::UploadedFile subtype is expected
  include ActionController::UploadedFile

  def read
    tempfile = File.new(self.path)
    tempfile.read
  end
end

显然,在Windows上,可以调用特定的IO方法来强制文件进入二进制模式。在tempfile上调用此方法,如下所示:

tempfile.binmode

导致一切按预期工作,UploadedFile的读取与磁盘上fixture文件的大小相匹配。