Class: CarrierWave::FileCardUploader
- Inherits:
-
Uploader::Base
- Object
- Uploader::Base
- CarrierWave::FileCardUploader
- Includes:
- Card::Env::Location
- Defined in:
- mod/carrierwave/lib/carrier_wave/file_card_uploader.rb
Overview
Takes care of the file upload for cards with attached files. Most of the upload behaviour depends on the card itself. (e.g. card type and storage option chosen for the card). So in contrary to CarrierWave's default uploader we depend very much on the model (= card object) to get the correct paths for retrieving and storing the file.
Cards that support attachments (by default those are cards of type "file" and "image") accept a file handle as a card attribute.
It's possible to upload files using a url. The card attribute for that is
remote_
Storage types
You can choose between four different storage options
- coded: These files are in the codebase, like the default logo. Every view is a wagn request.
- local: Uploaded files which are stored in a local upload directory (upload path is configurable via config.paths["files"]). If read permissions are set such that "Anyone" can read, then there is a symlink from the public directory. Otherwise every view is a wagn request.
- cloud: You can configure buckets that refer to an external storage service. Link is rendered as absolute url
- web: A fixed url (to external source). No upload or other file processing. Link is just the saved url.
Currently, there is no web interface that let's a user or administrator choose a storage option for a specific card or set of cards. There is only a global config option to set the storage type for all new uploads (config.storage_type). On the *admin card it's possible to update all existing file cards according to the current global config.
Storage types for single cards can be changed by developers using the card attributes "storage_type", "bucket", and "mod".
Depending on the storage type the uploader uses the following paths and identifiers.
Identifier (stored in the database as db_content)
- coded: :codename/mod_name.ext
- local: ~card_id/action_id.ext
- cloud: (bucket)/card_id/action_id.ext
- web: http://url
Storage path
- coded: mod_dir/file/codename/type_code(-variant).ext (no colon on codename!)
- local: files_dir/card_id/action_id(-variant).ext (no tilde on id!)
- cloud: bucket/bucket_subdir/id/action_id(-variant).ext
- web: no storage
Variants are only used for images. Possible options are icon|small|medium|large|original. files_dir, bucket, and bucket_subdir can be changed via config options.
Supported url patterns
mark.ext mark/revision.ext mark/revision-variant.ext /files/mark/revision-variant.ext # <- public symlink if readable by # "Anyone"
can be one of the following options
- ~
- :
Examples: *logo.png ~22/33-medium.png # local :yeti_skin/standard-large.png # coded
Direct Known Subclasses
Constant Summary collapse
- STORAGE_TYPES =
[:cloud, :web, :coded, :local].freeze
- CONFIG_OPTIONS =
[:provider, :attributes, :directory, :public, :credentials, :authenticated_url_expiration, :use_ssl_for_aws].freeze
- CONFIG_CREDENTIAL_OPTIONS =
[ :provider, :aws_access_key_id, :aws_secret_access_key, :region, :host, :endpoint, :google_access_key_id, :google_secret_access_key ].freeze
Instance Attribute Summary collapse
-
#mod ⇒ Object
Returns the value of attribute mod.
Instance Method Summary collapse
- #action_id ⇒ Object
- #cache_dir ⇒ Object
- #content_type ⇒ Object
- #create_versions?(new_file) ⇒ Boolean
-
#db_content(opts = {}) ⇒ Object
generate identifier that gets stored in the card's db_content field.
- #extension ⇒ Object
- #filename ⇒ Object
- #local_url(opts = {}) ⇒ Object
- #local_url_base(opts = {}) ⇒ Object
- #original_filename ⇒ Object
-
#path(version = nil) ⇒ Object
paperclip compatibility used in type/file.rb#core (base format).
- #public_path ⇒ Object
- #retrieve_path ⇒ Object
-
#store_path(for_file = nil) ⇒ Object
Carrierwave calls store_path without argument when it stores the file and with the identifier from the db when it retrieves the file.
- #tmp_path ⇒ Object
- #url(opts = {}) ⇒ Object
- #url_filename(opts = {}) ⇒ Object
- #valid? ⇒ Boolean
Methods included from Card::Env::Location
#card_path, #card_url, #protocol_and_host
Instance Attribute Details
#mod ⇒ Object
Returns the value of attribute mod.
149 150 151 |
# File 'mod/carrierwave/lib/carrier_wave/file_card_uploader.rb', line 149 def mod @mod end |
Instance Method Details
#action_id ⇒ Object
280 281 282 |
# File 'mod/carrierwave/lib/carrier_wave/file_card_uploader.rb', line 280 def action_id model.selected_content_action_id || action_id_stand_in end |
#cache_dir ⇒ Object
240 241 242 |
# File 'mod/carrierwave/lib/carrier_wave/file_card_uploader.rb', line 240 def cache_dir @model.files_base_dir + "/cache" end |
#content_type ⇒ Object
183 184 185 186 187 188 189 |
# File 'mod/carrierwave/lib/carrier_wave/file_card_uploader.rb', line 183 def content_type # the original file's content_type method doesn't seem to be very reliable # It uses mime_magic_content_type which returns invalid/invalid for css files # that start with a comment @content_type ||= file.send(:existing_content_type) || file.send(:mini_mime_content_type) end |
#create_versions?(new_file) ⇒ Boolean
266 267 268 |
# File 'mod/carrierwave/lib/carrier_wave/file_card_uploader.rb', line 266 def create_versions? new_file model.create_versions? new_file end |
#db_content(opts = {}) ⇒ Object
generate identifier that gets stored in the card's db_content field
198 199 200 201 202 203 204 |
# File 'mod/carrierwave/lib/carrier_wave/file_card_uploader.rb', line 198 def db_content opts={} model. opts do return model.content if model.web? return "" unless file.present? "%s/%s" % [file_dir, url_filename] end end |
#extension ⇒ Object
174 175 176 177 178 179 180 181 |
# File 'mod/carrierwave/lib/carrier_wave/file_card_uploader.rb', line 174 def extension case when file&.extension.present? then ".#{file.extension}" when card_content = model.content then File.extname(card_content) when orig = original_filename then File.extname(orig) else "" end.downcase end |
#filename ⇒ Object
166 167 168 169 170 171 172 |
# File 'mod/carrierwave/lib/carrier_wave/file_card_uploader.rb', line 166 def filename if model.coded? "#{model.type_code}#{extension}" else "#{action_id}#{extension}" end end |
#local_url(opts = {}) ⇒ Object
227 228 229 |
# File 'mod/carrierwave/lib/carrier_wave/file_card_uploader.rb', line 227 def local_url opts={} "%s/%s/%s" % [local_url_base(opts), file_dir, full_filename(url_filename(opts))] end |
#local_url_base(opts = {}) ⇒ Object
231 232 233 234 |
# File 'mod/carrierwave/lib/carrier_wave/file_card_uploader.rb', line 231 def local_url_base opts={} web_path = Card.config.files_web_path opts.delete(:absolute) ? card_url(web_path) : card_path(web_path) end |
#original_filename ⇒ Object
275 276 277 278 |
# File 'mod/carrierwave/lib/carrier_wave/file_card_uploader.rb', line 275 def original_filename @original_filename ||= model.selected_action && model.selected_action.comment end |
#path(version = nil) ⇒ Object
paperclip compatibility used in type/file.rb#core (base format)
271 272 273 |
# File 'mod/carrierwave/lib/carrier_wave/file_card_uploader.rb', line 271 def path version=nil version ? versions[version].path : super() end |
#public_path ⇒ Object
236 237 238 |
# File 'mod/carrierwave/lib/carrier_wave/file_card_uploader.rb', line 236 def public_path File.join Cardio.paths["public"].existent.first, url end |
#retrieve_path ⇒ Object
257 258 259 |
# File 'mod/carrierwave/lib/carrier_wave/file_card_uploader.rb', line 257 def retrieve_path File.join([retrieve_dir, full_filename(filename)].compact) end |
#store_path(for_file = nil) ⇒ Object
Carrierwave calls store_path without argument when it stores the file and with the identifier from the db when it retrieves the file. In our case the first part of our identifier is not part of the path but we can construct the filename from db data. So we don't need the identifier.
249 250 251 252 253 254 255 |
# File 'mod/carrierwave/lib/carrier_wave/file_card_uploader.rb', line 249 def store_path for_file=nil if for_file retrieve_path else File.join([store_dir, full_filename(filename)].compact) end end |
#tmp_path ⇒ Object
261 262 263 264 |
# File 'mod/carrierwave/lib/carrier_wave/file_card_uploader.rb', line 261 def tmp_path Dir.mkdir model.tmp_upload_dir unless Dir.exist? model.tmp_upload_dir File.join model.tmp_upload_dir, filename end |
#url(opts = {}) ⇒ Object
217 218 219 220 221 222 223 224 225 |
# File 'mod/carrierwave/lib/carrier_wave/file_card_uploader.rb', line 217 def url opts={} if model.cloud? file&.url elsif model.web? model.content else local_url opts end end |
#url_filename(opts = {}) ⇒ Object
206 207 208 209 210 211 212 213 214 |
# File 'mod/carrierwave/lib/carrier_wave/file_card_uploader.rb', line 206 def url_filename opts={} model. opts do if model.coded? "#{model.mod}#{extension}" else "#{action_id}#{extension}" end end end |
#valid? ⇒ Boolean
162 163 164 |
# File 'mod/carrierwave/lib/carrier_wave/file_card_uploader.rb', line 162 def valid? extension.present? end |