开发者

Length of uploaded file in Ruby on Rails decreases after UploadedFile.read

On a RoR app that i've inherited, a test is failing that involves a file upload. The assertion that fails looks like so:

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

It fails with (the test file is 69 bytes):

<69> expected but was <5>.

This is after a post using:

fixture_file_upload(filename, content_type, :binary)

In the candidate model, the uploaded file is assigned to a property that is then saved to a mediumblob in MySQL. It looks to me like the uploaded file is 69 bytes, but after it is assigned to the model property (using UploadedFile.read), the length is sh开发者_如何学Cowing as only 5 bytes.

So this code:

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

results in this output:

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

I'm at a bit of a loss as to why this is, any ideas?


This came down to a Windows/Ruby idiosyncrasy, where reading the file appeared to be happening in text mode. There is an extension in this app in test_helper, something like:

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

And apparently, on Windows, there is a specific IO method that can be called to force the file into binary mode. Calling this method on the tempfile, like so:

tempfile.binmode

caused everything to work as expected, with the read from the UploadedFile matching the size of the fixture file on disk.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜