Skip to content

Commit 2d710bd

Browse files
committed
Handle double filenames
1 parent 9a2ad36 commit 2d710bd

File tree

2 files changed

+28
-11
lines changed

2 files changed

+28
-11
lines changed

lib/active_storage/send_zip.rb

+20-3
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
require 'rails'
33
require 'zip'
44
require 'tempfile'
5+
require 'pathname'
56

67
module ActiveStorage
78
module SendZip
@@ -31,15 +32,31 @@ def save_files_on_server(files)
3132
require 'zip'
3233
# get a temporary folder and create it
3334
temp_folder = Dir.mktmpdir 'active_storage-send_zip'
34-
# FileUtils.mkdir_p(temp_folder) unless Dir.exist?(temp_folder)
35+
36+
# count each files to avoid duplicates
37+
filepaths = []
3538

3639
# download all ActiveStorage into
37-
files.map do |picture|
40+
files.each do |picture|
3841
filename = picture.filename.to_s
3942
filepath = File.join temp_folder, filename
43+
44+
# ensure that filename not exists
45+
if filepaths.include? filepath
46+
# create a new random filenames
47+
basename = File.basename filename
48+
extension = File.extname filename
49+
50+
filename = "#{basename}_#{SecureRandom.uuid}#{extension}"
51+
filepath = File.join temp_folder, filename
52+
end
53+
4054
File.open(filepath, 'wb') { |f| f.write(picture.download) }
41-
filepath
55+
56+
filepaths << filepath
4257
end
58+
59+
filepaths
4360
end
4461

4562
# Create a temporary zip file & return the content as bytes

test/active_storage/send_zip_test.rb

+8-8
Original file line numberDiff line numberDiff line change
@@ -43,14 +43,14 @@ def test_it_should_save_two_active_support
4343
assert_produce_files files, count: 2
4444
end
4545

46-
# def test_it_should_save_two_active_support
47-
# files = [
48-
# ActiveStorageMock.new('foo.txt'),
49-
# ActiveStorageMock.new('foo.txt')
50-
# ]
51-
#
52-
# assert_produce_files files, count: 2
53-
# end
46+
def test_it_should_save_two_active_support
47+
files = [
48+
ActiveStorageMock.new('foo.txt'),
49+
ActiveStorageMock.new('foo.txt')
50+
]
51+
52+
assert_produce_files files, count: 2
53+
end
5454

5555
private
5656

0 commit comments

Comments
 (0)