S3 bucket объект загружает дубликаты файлов - PullRequest
1 голос
/ 01 апреля 2020

Я ужасно пытаюсь выяснить, почему загружаются дубликаты файлов. Вот что происходит:

  1. Мы загружаем фотографии различного размера (например, ширина 75, ширина 300, ширина 1920 и т. Д. c).
  2. Загрузка прошла успешно, и я вижу в регистрация, что никакие фотографии не созданы дважды. Загрузка фотографий выполняется последовательно, но КАЖДЫЙ ВРЕМЯ в 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 есть два.

...