Я ужасно пытаюсь выяснить, почему загружаются дубликаты файлов. Вот что происходит:
- Мы загружаем фотографии различного размера (например, ширина 75, ширина 300, ширина 1920 и т. Д. c).
- Загрузка прошла успешно, и я вижу в регистрация, что никакие фотографии не созданы дважды. Загрузка фотографий выполняется последовательно, но КАЖДЫЙ ВРЕМЯ в S3 есть две записи по 300 каналов. Это происходит ТОЛЬКО на фотографиях такого размера, каждый раз.
Даже если я запускаю некоторый код, который проверяет, существует ли уже объект, для этой заданной c ширины создаются дубликаты.
Вот код загрузки класса S3:
def self.upload(file, bucket, object_path)
# Build and setup path to object
unless bucket.object(object_path).exists?
obj = bucket.object(object_path)
# Upload file to object path
obj.upload_file(file.path, acl: 'public-read')
# # Return S3 public url of cached image
obj.public_url({virtual_host: true}).gsub("REDACTED.com", "cdn.REDACTED.com").gsub("http://", "https://")
end
end
Дубликаты буквально одинаковы. Это не сбой пользовательского интерфейса, я вижу их обоих в S3.bucket.objects.to_a
Резюме: дубликаты 300 Вт загружаются каждый раз, даже если все размеры загружаются вместе, при этом каждый конкретный файл постоянно дублируется.
У кого-нибудь есть идеи?
РЕДАКТИРОВАТЬ
Вот код, в котором итерируются и загружаются кэши:
initial_cache_sizes = [
{width: 75, height: 50},
# Width 300
{width: 300, height: 200},
# Width 830
{width: 830, height: 553},
]
caches = initial_cache_sizes.map {|cache| create_cache(cache)}
# create an object to be uploaded
def create_cache(attributes)
Cache.new(self, attributes).build
end
class Cache
# Tableless Model | Extending methods
extend ActiveModel::Naming
# Tableless Model | Setting attributes
attr_accessor :cacheable, :size, :width, :height, :path, :disclaimer, :aspect_ratio, :vendor_watermark, :company_watermark, :file
# Tableless Model | Initialize based on PlanOcore
def initialize(cacheable, attributes = {})
# Build model from attributes
attributes.each do |name, value|
# Save value to model
send("#{name}=", value)
end
# Save photo or floor_plan to cacheable
send("cacheable=", cacheable)
# Save file to cache
send("file=", MiniMagick::Image.open(cacheable.path))
end
# Build cache file
def build
begin
# Resize if width and height are given.
resize if width && height
# Resize if a size was given.
crop(aspect_ratio) if aspect_ratio
# Add vendor watermark if asked for and available.
add_watermark(cacheable.vendor_watermark, "south-east") if vendor_watermark
# Add company watermark if asked for and available.
add_watermark(cacheable.company_watermark, "south-west") if company_watermark
# Add disclaimer is asked for.
add_disclaimer if disclaimer
# Upload to S3
upload
ensure
unlink # Delete tempfile
end
response_format # Return cache.
end
def upload
# Build S3 path.
s3_path = "#{cacheable.s3_path}/#{file_name}"
# Upload file to S3
send("path=", S3.upload(file, cacheable.bucket, s3_path))
end
# S3.upload code outlined above
Это вывод логирования объекта кэшей из caches = initial_cache_sizes.map {|cache| create_cache(cache)}
{:size=>5041, :width=>75, :height=>50, :path=>"REDACTED", :key=>"75w50h", :disclaimer=>nil, :vendor_watermark=>nil, :company_watermark=>nil}
{:size=>37317, :width=>300, :height=>200, :path=>"REDACTED", :key=>"300w200h", :disclaimer=>nil, :vendor_watermark=>nil, :company_watermark=>nil}
{:size=>186293, :width=>830, :height=>553, :path=>"REDACTED", :key=>"830w553h", :disclaimer=>nil, :vendor_watermark=>nil, :company_watermark=>nil}
{:size=>264617, :width=>1024, :height=>682, :path=>"REDACTED", :key=>"1024w682h", :disclaimer=>nil, :vendor_watermark=>nil, :company_watermark=>nil}
{:size=>787140, :width=>1920, :height=>1280, :path=>"REDACTED", :key=>"1920w1280h", :disclaimer=>nil, :vendor_watermark=>nil, :company_watermark=>nil}
Как видите, только файл шириной ОДИН 300, но в S3 есть два.