I have used attachment_fu before with no real problems but I'm not
sure if it is what I need now..
I have an application that stores blobs (word documents, scanned
documents etc) in the database.
I want to convert it to store in S3.
All the paperclip and attachment_fu examples deal with images and
resizing and thumbnails etc etc which are not relevent in this case.
Are they still the best options or should I just use the aws-s3 gem on
its own?
Ideally I'd like to just replace the database "content" column by
saving to S3 as part of an AR callback and have an accessor on the
model that retrievs the attachment only when requested...
George -
I did the exact thing a few months ago - actually for a test environment as I deal with credit data and cant put live data on S3. Anyhow, I tried and really liked paperclip, but ended up just going directly with the s3 gem. I thing there were some complications with how I wanted to be able to both save and modify files which I found easier going with S3 gem directly. Anyhow, here are my functions…
def self.save_file(file_path, data)
begin
if USE_AMAZON_S3
require ‘aws/s3’
file_path = file_path.gsub(FILESTORE, “”) # remove the path to filestore (leaving the app as is since S3 is for test only)
#file_path = file_path.gsub(/^//, “”)
AWS::S3::Base.establish_connection!(
:access_key_id => ‘zzzzz’,
:secret_access_key => ‘zzzzz’
)
AWS::S3::S3Object.store(file_path, data, AMAZON_S3_BUCKET)
return true if AWS::S3::Service.response.success?
else
FileUtils.mkdir_p GlobalFunctions.get_path_without_file_name(file_path)
chars_written = File.open(file_path, ‘w’) {|f| f.write(data) }
return true if chars_written == data.length
end
rescue
SystemError.new(:user_id => nil,
:account_id => nil,
:location => “GlobalFunctions.save_file”,
:error => “failed to save file”,
:incidentals => {“file_path” => file_path,
“data” => data}
).save
end
false
end
def self.load_file_data(path)
begin
if USE_AMAZON_S3
require ‘aws/s3’
path = path.gsub(FILESTORE, “”) # remove the path to filestore (leaving the app as is since S3 is for test only)
AWS::S3::Base.establish_connection!(
:access_key_id => ‘zzzzz’,
:secret_access_key => ‘zzzzz’
)
return AWS::S3::S3Object.value path, AMAZON_S3_BUCKET
else
return File.open(path, “r”).read
end
rescue
SystemError.new(:user_id => nil,
:account_id => nil,
:location => “GlobalFunctions.load_file_data”,
:error => “failed to read file”,
:incidentals => {“path” => path}
).save
end
nil
end
Yeah… that was all trial an error on the ruby console. Wasn’t too bad but as always these things can be an adventure. Do note that you probably want to put your S3 auth info somewhere else/safer than I did it.