UPDATE January 14, 2009 -> The patch for this bug was accepted!
I'm pretty new to Rails and my first project included uploading videos. Shouldn't be too difficult I thought, after a little Google searching, I came up with the perfect example by Jim Neath: Converting Videos with Rails: Converting the Video Wanting to practice new skills with RSpec and Cucumber I wrote my first feature spec:
Feature: Upload videos In order to provide videos to users after hours As a videographer I want to upload videos Scenario: A valid filename is provided Given I go to the new video page And I browse to the file "Movie_0001.avi" When I submit the upload Then I should see "success" And the file should be uploadedand the supporting steps file, upload_steps.rb:
require 'ftools' require 'mime/types' When /I browse to the file \"(.+)\"/ do |path| @original_filepath = File.join('features/fixtures/', path) mime_types = MIME::Types.of(@original_filepath) attach_file 'video[source]', @original_filepath, mime_types[0].content_type end When 'I submit the upload' do click_button 'Create' end def uploaded_filepath uploaded_basename = File.basename(@original_filepath) File.join(RAILS_ROOT, "public/videos/1", uploaded_basename) end Then /the file should be uploaded/ do assert File.compare(@original_filepath, uploaded_filepath) endwhat I got was:
... And the file should be uploadedOn closer inspection, the test was failing because the uploaded file was truncated in some bizarre way. However, if I ran the application and manually upload a file from the browser, everything worked fine. After much hunting I ended up in rails/actionpack/lib/action_controller/integration.rb where in multipart_body, the mode is not specified in the call to File.open, so it defaults to "r". This is all well and good on anything but Windows, which I happen to be using! Windows requires that the mode be specified as "rb" to ensure the file is read as binary. I submitted a patch but I'm not holding my breath for it to be pulled in anytime soon.is not true. (Test::Unit::AssertionFailedError) c:/ruby/lib/ruby/1.8/test/unit/assertions.rb:48:in `assert_block' c:/ruby/lib/ruby/1.8/test/unit/assertions.rb:500:in `_wrap_assertion' c:/ruby/lib/ruby/1.8/test/unit/assertions.rb:46:in `assert_block' c:/ruby/lib/ruby/1.8/test/unit/assertions.rb:63:in `assert' c:/ruby/lib/ruby/1.8/test/unit/assertions.rb:495:in `_wrap_assertion' c:/ruby/lib/ruby/1.8/test/unit/assertions.rb:61:in `assert' ./features/upload/steps/upload_steps.rb:22:in `And /the file should be uploaded/' features/upload/upload.feature:14:in `And the file should be uploaded' ...