Class: CamaleonCmsLocalUploader

Inherits:
CamaleonCmsUploader show all
Defined in:
app/uploaders/camaleon_cms_local_uploader.rb

Constant Summary

Constants inherited from CamaleonCmsUploader

CamaleonCmsUploader::PRIVATE_DIRECTORY

Instance Attribute Summary

Attributes inherited from CamaleonCmsUploader

#thumb

Instance Method Summary collapse

Methods inherited from CamaleonCmsUploader

#cache_item, #clear_cache, #disable_private_mode!, #enable_private_mode!, #file_exists?, #get_file, get_file_format, get_file_format_extensions, #get_media_collection, #initialize, #objects, #reload, #search, #search_new_key, validate_file_format, #version_path

Constructor Details

This class inherits a constructor from CamaleonCmsUploader

Instance Method Details

#add_file(uploaded_io_or_file_path, key, args = {}) ⇒ Object

save a file into local folder



61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
# File 'app/uploaders/camaleon_cms_local_uploader.rb', line 61

def add_file(uploaded_io_or_file_path, key, args = {})
  args, res = {same_name: false, is_thumb: false}.merge(args), nil
  key = search_new_key(key) unless args[:same_name]

  if @instance # private hook to upload files by different way, add file data into result_data
    _args={result_data: nil, file: uploaded_io_or_file_path, key: key, args: args, klass: self}; @instance.hooks_run('uploader_local_before_upload', _args)
    return _args[:result_data] if _args[:result_data].present?
  end

  add_folder(File.dirname(key)) if File.dirname(key).present?
  upload_io = uploaded_io_or_file_path.is_a?(String) ? File.open(uploaded_io_or_file_path) : uploaded_io_or_file_path
  File.open(File.join(@root_folder, key), 'wb'){|file|       file.write(upload_io.read) }
  res = cache_item(file_parse(key)) unless args[:is_thumb]
  res
end

#add_folder(key) ⇒ Object

create a new folder into local directory



78
79
80
81
82
83
84
85
86
87
# File 'app/uploaders/camaleon_cms_local_uploader.rb', line 78

def add_folder(key)
  d, is_new_folder = File.join(@root_folder, key).to_s, false
  unless Dir.exist?(d)
    FileUtils.mkdir_p(d)
    is_new_folder = true if File.basename(d) != 'thumb'
  end
  f = file_parse(key)
  cache_item(f) if is_new_folder
  f
end

#after_initializeObject



2
3
4
5
6
# File 'app/uploaders/camaleon_cms_local_uploader.rb', line 2

def after_initialize
  @root_folder = @args[:root_folder] || @current_site.upload_directory

  FileUtils.mkdir_p(@root_folder)
end

#browser_files(prefix = '/', objects = {}) ⇒ Object



14
15
16
17
18
19
20
21
22
23
24
25
26
27
# File 'app/uploaders/camaleon_cms_local_uploader.rb', line 14

def browser_files(prefix = '/', objects = {})
  path = File.join(@root_folder, prefix)

  Dir.entries(path).each do |f_name|
    next if f_name == '..' || f_name == '.' || f_name == 'thumb'

    obj = file_parse(File.join(path, f_name).sub(@root_folder, '').cama_fix_media_key)
    cache_item(obj)

    if obj['is_folder']
      browser_files(File.join(prefix, obj['name']))
    end
  end
end

#delete_file(key) ⇒ Object

remove an existent file



97
98
99
100
101
102
# File 'app/uploaders/camaleon_cms_local_uploader.rb', line 97

def delete_file(key)
  file = File.join(@root_folder, key)
  FileUtils.rm(file) if File.exist? file
  @instance.hooks_run('after_delete', key)
  get_media_collection.find_by_key(key).take.destroy
end

#delete_folder(key) ⇒ Object

remove an existent folder



90
91
92
93
94
# File 'app/uploaders/camaleon_cms_local_uploader.rb', line 90

def delete_folder(key)
  folder = File.join(@root_folder, key)
  FileUtils.rm_rf(folder) if Dir.exist? folder
  get_media_collection.find_by_key(key).take.destroy
end

#fetch_file(file_name) ⇒ Object



29
30
31
32
33
34
35
# File 'app/uploaders/camaleon_cms_local_uploader.rb', line 29

def fetch_file(file_name)
  if file_exists?(file_name)
    file_name
  else
    raise ActionController::RoutingError, 'File not found'
  end
end

#file_parse(key) ⇒ Object



37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
# File 'app/uploaders/camaleon_cms_local_uploader.rb', line 37

def file_parse(key)
  file_path = File.join(@root_folder, key)
  url_path, is_dir = file_path.sub(Rails.root.join('public').to_s, ''), File.directory?(file_path)
  res = {
      "name" => File.basename(key),
      "folder_path" => File.dirname(key),
      "url" => is_dir ? '' : (is_private_uploader? ? url_path.sub("#{@root_folder}/", '') : File.join(@current_site.decorate.the_url(as_path: true, locale: false, skip_relative_url_root: true), url_path)),
      "is_folder" => is_dir,
      "file_size" => is_dir ? 0 : File.size(file_path).round(2),
      "thumb" => '',
      'file_type' => self.class.get_file_format(file_path),
      'dimension' => ''
  }.with_indifferent_access
  res['key'] = File.join(res['folder_path'], res['name'])
  res["thumb"] = (is_private_uploader? ? '/admin/media/download_private_file?file=' + version_path(key).slice(1..-1) : version_path(res['url'])) if res['file_type'] == 'image' && File.extname(file_path).downcase != '.gif'
  if res['file_type'] == 'image'
    res["thumb"].sub! '.svg', '.jpg'
    im = MiniMagick::Image.open(file_path)
    res['dimension'] = "#{im[:width]}x#{im[:height]}" rescue "0x0" # Malformed SVGs raise an exception here.
  end
  res
end

#parse_key(file_path) ⇒ Object

convert a real file path into file key



105
106
107
# File 'app/uploaders/camaleon_cms_local_uploader.rb', line 105

def parse_key(file_path)
  file_path.sub(@root_folder, '').cama_fix_media_key
end

#setup_private_folderObject



8
9
10
11
12
# File 'app/uploaders/camaleon_cms_local_uploader.rb', line 8

def setup_private_folder
  @root_folder = Rails.root.join(self.class::PRIVATE_DIRECTORY).to_s

  FileUtils.mkdir_p(@root_folder) unless Dir.exist?(@root_folder)
end