From 291fc1bce82b2306d38a5de98c9deccadc92319e Mon Sep 17 00:00:00 2001 From: Parker Selbert Date: Thu, 23 May 2013 06:03:26 -0500 Subject: [PATCH] Prevent timeout errors when storing files According to aws-ruby's maintainer upload timeouts typically occur because the content length couldn't be determined directly. The fix is fairly simple, just pass a path to the file instead of the file data and the gem will open it in binary mode itself. An integration test (and all of the support around that) had to be put in place to maintain confidence about the test. --- .env.sample | 3 +++ .gitignore | 2 ++ lib/carrierwave/storage/aws.rb | 6 +----- spec/features/storing_files_spec.rb | 29 ++++++++++++++++++++++++++++ spec/fixtures/image.png | Bin 0 -> 17905 bytes spec/spec_helper.rb | 11 +++++++++++ 6 files changed, 46 insertions(+), 5 deletions(-) create mode 100644 .env.sample create mode 100644 spec/features/storing_files_spec.rb create mode 100644 spec/fixtures/image.png diff --git a/.env.sample b/.env.sample new file mode 100644 index 0000000..ca8479f --- /dev/null +++ b/.env.sample @@ -0,0 +1,3 @@ +S3_BUCKET_NAME=BUCKET_NAME +S3_ACCESS_KEY=YOUR_KEY +S3_SECRET_ACCESS_KEY=YOUR_KEY diff --git a/.gitignore b/.gitignore index 46b493e..3506690 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,8 @@ *.gem .bundle .config +.env Gemfile.lock bin vendor +uploads diff --git a/lib/carrierwave/storage/aws.rb b/lib/carrierwave/storage/aws.rb index 36b598c..86e9c34 100644 --- a/lib/carrierwave/storage/aws.rb +++ b/lib/carrierwave/storage/aws.rb @@ -73,15 +73,11 @@ def size end def store(new_file) - aws_file = new_file.to_file - - @file = bucket.objects[path].write(aws_file, { + @file = bucket.objects[path].write(new_file.file, { acl: uploader.aws_acl, content_type: new_file.content_type }.merge(uploader.aws_attributes || {})) - aws_file.close unless aws_file.closed? - true end diff --git a/spec/features/storing_files_spec.rb b/spec/features/storing_files_spec.rb new file mode 100644 index 0000000..ba2e052 --- /dev/null +++ b/spec/features/storing_files_spec.rb @@ -0,0 +1,29 @@ +require 'spec_helper' + +if ENV['S3_BUCKET_NAME'] + describe 'Storing Files' do + before(:all) do + CarrierWave.configure do |config| + config.storage = :aws + config.aws_bucket = ENV['S3_BUCKET_NAME'] + config.aws_acl = :public_read + + config.aws_credentials = { + access_key_id: ENV['S3_ACCESS_KEY'], + secret_access_key: ENV['S3_SECRET_ACCESS_KEY'] + } + end + end + + it 'uploads the file to the configured bucket' do + image = File.open('spec/fixtures/image.png', 'r') + uploader = Class.new(CarrierWave::Uploader::Base) + instance = uploader.new + + expect { + instance.store!(image) + instance.retrieve_from_store!('image_file.png') + }.to_not raise_error + end + end +end diff --git a/spec/fixtures/image.png b/spec/fixtures/image.png new file mode 100644 index 0000000000000000000000000000000000000000..2cb4bd0e502343132fb6394a4a5a340b94c5f914 GIT binary patch literal 17905 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 N^mO%eS?83{1OT^ZQ0o8y literal 0 HcmV?d00001 diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index d639363..43b5d38 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -2,9 +2,20 @@ require 'carrierwave' require 'carrierwave-aws' +def source_environment_file! + return unless File.exists?('.env') + + File.readlines('.env').each do |line| + values = line.split('=') + ENV[values.first] = values.last.chomp + end +end + RSpec.configure do |config| config.treat_symbols_as_metadata_keys_with_true_values = true config.filter_run :focus config.order = 'random' config.run_all_when_everything_filtered = true + + source_environment_file! end