-
Notifications
You must be signed in to change notification settings - Fork 290
Expand file tree
/
Copy pathcamaleon_cms_local_uploader.rb
More file actions
127 lines (110 loc) · 4.16 KB
/
camaleon_cms_local_uploader.rb
File metadata and controls
127 lines (110 loc) · 4.16 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
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
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
class CamaleonCmsLocalUploader < CamaleonCmsUploader
def after_initialize
@root_folder = @args[:root_folder] || @current_site.upload_directory
FileUtils.mkdir_p(@root_folder)
end
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
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
def fetch_file(file_name)
raise ActionController::RoutingError, 'File not found' unless file_exists?(file_name)
file_name
end
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
# save a file into local folder
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
# create a new folder into local directory
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
# remove an existent folder
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
# remove an existent file
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
# convert a real file path into file key
def parse_key(file_path)
file_path.sub(@root_folder, '').cama_fix_media_key
end
end