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



77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
# File 'app/uploaders/camaleon_cms_local_uploader.rb', line 77

def add_file(uploaded_io_or_file_path, key, args = {})
  args = { same_name: false, is_thumb: false }.merge(args)
  res = 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



96
97
98
99
100
101
102
103
104
105
106
# File 'app/uploaders/camaleon_cms_local_uploader.rb', line 96

def add_folder(key)
  d = File.join(@root_folder, key).to_s
  is_new_folder = 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
# 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 ['..', '.', 'thumb'].include?(f_name)

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

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

#delete_file(key) ⇒ Object

remove an existent file



116
117
118
119
120
121
# File 'app/uploaders/camaleon_cms_local_uploader.rb', line 116

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



109
110
111
112
113
# File 'app/uploaders/camaleon_cms_local_uploader.rb', line 109

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

Raises:

  • (ActionController::RoutingError)


27
28
29
30
31
# File 'app/uploaders/camaleon_cms_local_uploader.rb', line 27

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

  file_name
end

#file_parse(key) ⇒ Object



33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
# File 'app/uploaders/camaleon_cms_local_uploader.rb', line 33

def file_parse(key)
  file_path = File.join(@root_folder, key)
  url_path = file_path.sub(Rails.root.join('public').to_s, '')
  is_dir = File.directory?(file_path)
  res = {
    'name' => File.basename(key),
    'folder_path' => File.dirname(key),
    'url' => if is_dir
               ''
             else
               (if is_private_uploader?
                  url_path.sub("#{@root_folder}/",
                               '')
                else
                  File.join(
                    @current_site.decorate.the_url(as_path: true, locale: false,
                                                   skip_relative_url_root: true), url_path
                  )
                end)
             end,
    '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'])
  if res['file_type'] == 'image' && File.extname(file_path).downcase != '.gif'
    res['thumb'] =
      (is_private_uploader? ? "/admin/media/download_private_file?file=#{version_path(key).slice(1..-1)}" : version_path(res['url']))
  end
  if res['file_type'] == 'image'
    res['thumb'].sub! '.svg', '.jpg'
    im = MiniMagick::Image.open(file_path)
    res['dimension'] = begin
      "#{im[:width]}x#{im[:height]}"
    rescue StandardError
      '0x0'
    end
  end
  res
end

#parse_key(file_path) ⇒ Object

convert a real file path into file key



124
125
126
# File 'app/uploaders/camaleon_cms_local_uploader.rb', line 124

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