Carrierwave возвращает неправильный размер файла - PullRequest
0 голосов
/ 23 октября 2018

У меня есть следующая модель:

class Asset < ApplicationRecord
  ## Associations ##
  belongs_to :assetable, polymorphic: true, optional: true

  ## Validations ##
  validate { |a| a.blank_to_nil :description }
  validate :file_size

  ## Callbacks ##
  before_save :default_attrs

  ## Misc ##
  mount_base64_uploader :attachment, AttachmentUploader

  ## Methods ##
  def version_url(ver)
    return nil unless attachment.versions[:images].send(ver)
    attachment.versions[:images].send(ver).url
  end

  private

  def assetable_const
    assetable_type.constantize
  end

  def attachment_size
    attachment.size
  end

  def assetable_max_file_size
    return 0.0 unless assetable_type
    assetable_type.constantize.max_file_size
  end

  def default_attrs
    self.alt = default_file_name if alt.blank?
    self.title = default_file_name if title.blank?
  end

  def default_file_name
    "#{default_assetable_name}-#{default_assetable_stamp}"
  end

  def default_assetable_name
    "#{assetable_type.downcase}-#{assetable_id}"
  end

  def default_assetable_stamp
    "#{Time.now.strftime('%d%m%y')}-#{attachment.filename}"
  end

  # for now add to attachment and title
  # error doesnt show on CMS under attachment
  def file_size
    return if attachment_size.to_f <= assetable_max_file_size.megabyte.to_f
    errors.add(
      :attachment,
      I18n.t(
        'validations.assets.max_file_size',
        value: assetable_max_file_size.to_s
      )
    )
  end
end

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

class Content::Panels::ImageOnly < Content::Panel
  ## Includes ##
  include Assetable

  ## Associations ##
  belongs_to :panel_holder, polymorphic: true

  ## Validations ##
  validates_presence_of :asset

  ## Misc ##
  set_assetables :asset

  ## Methods ##
  def self.max_file_size
    1.0
  end

Я загружаю прикрепленное изображение - 680 КБ.Когда я добавляю binding.pry в метод file_size, я вижу, что attachment.size возвращает значение более 1 МБ:

pry(#<Asset>)> attachment.size.to_f
=> 2481189.0

Возвращается ли это значение в битах байтов?Если кажется, что это биты, то это половина реального размера файла (что может быть возможно из-за магии сжатия), но я предположил, что он вернет байты

def max_file_size
  3.0
end

Установка значения 3 МБ проходит проверку.2MB не удается.Любая помощь очень ценится

РЕДАКТИРОВАТЬ: загружаемое изображение: https://imgur.com/a/3TG9rLt

1 Ответ

0 голосов
/ 23 октября 2018

Для тех, кто сходит с ума - проверено с различными файлами - размер файла, кажется, возвращается в битах.

...