lib/carrierwave/storage/grid_fs.rb in carrierwave-mongoid-0.2.2 vs lib/carrierwave/storage/grid_fs.rb in carrierwave-mongoid-0.3.0
- old
+ new
@@ -1,101 +1,81 @@
# encoding: utf-8
-require 'mongo'
module CarrierWave
module Storage
##
# The GridFS store uses MongoDB's GridStore file storage system to store files
#
- # There are two ways of configuring the GridFS connection. Either you create a
- # connection or you reuse an existing connection.
+ # When you already have a Mongo connection object (for example through Mongoid)
+ # you can also reuse this connection:
#
- # Creating a connection looks something like this:
- #
# CarrierWave.configure do |config|
# config.storage = :grid_fs
- # config.grid_fs_host = "your-host.com"
- # config.grid_fs_port = "27017"
- # config.grid_fs_database = "your_dbs_app_name"
- # config.grid_fs_username = "user"
- # config.grid_fs_password = "verysecret"
- # config.grid_fs_access_url = "/images"
+ # config.grid_fs_access_url = "/system/uploads"
# end
#
# In the above example your documents url will look like:
#
- # http://your-app.com/images/:document-identifier-here
+ # http://your-app.com/system/uploads/:document-identifier-here
#
- # When you already have a Mongo connection object (for example through Mongoid)
- # you can also reuse this connection:
- #
- # CarrierWave.configure do |config|
- # config.storage = :grid_fs
- # config.grid_fs_connection = Mongoid.database
- # config.grid_fs_access_url = "/images"
- # end
- #
class GridFS < Abstract
class File
attr_reader :path
+ attr_reader :uploader
+ attr_reader :grid_file
def initialize(uploader, path)
@path = path
@uploader = uploader
+ @grid_file = nil
end
def url
unless @uploader.grid_fs_access_url
nil
else
::File.join(@uploader.grid_fs_access_url, path)
end
end
- def read
- grid.open(path, 'r').data
+ def grid_file(&block)
+ @grid_file ||= grid[path]
end
def write(file)
- grid.open(@uploader.store_path, 'w', :content_type => file.content_type) do |f|
- f.write(file.read)
- end
+ grid[@uploader.store_path] = file
+ ensure
+ @grid_file = nil
end
- def delete
- grid.delete(path)
+ def read
+ grid_file.data if grid_file
end
- def content_type
- grid.open(path, 'r').content_type
+ %w( delete content_type length ).each do |method|
+ class_eval <<-__, __FILE__, __LINE__
+ def #{ method }
+ grid_file.#{ method } if grid_file
+ end
+ __
end
- def file_length
- grid.open(path, 'r').file_length
- end
- alias :size :file_length
+ alias :content_length :length
+ alias :file_length :length
+ alias :size :length
protected
-
- def database
- @connection ||= @uploader.grid_fs_connection || begin
- host = @uploader.grid_fs_host
- port = @uploader.grid_fs_port
- database = @uploader.grid_fs_database
- username = @uploader.grid_fs_username
- password = @uploader.grid_fs_password
- db = Mongo::Connection.new(host, port).db(database)
- db.authenticate(username, password) if username && password
- db
- end
+ class << File
+ attr_accessor :grid
end
+ self.grid = ::Mongoid::GridFS
+
def grid
- @grid ||= Mongo::GridFileSystem.new(database)
+ self.class.grid
end
-
end
##
# Store the file in MongoDB's GridFS GridStore
#