Carrierwave 返回错误的文件大小
Carrierwave returning wrong file sizes
我有以下型号:
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 KB。当我在我的 'file_size' 方法中放置一个 binding.pry 时,我可以看到 attachment.size return 一个超过 1MB 的值:
pry(#<Asset>)> attachment.size.to_f
=> 2481189.0
这个值是以字节为单位 return编辑的吗?如果位显示它是实际文件大小的一半(这可能是由于压缩魔术)但我假设它会 return 字节..
我的方法每次都失败,除非我增加最大文件大小:
def max_file_size
3.0
end
将其设置为 3MB 即可通过验证。 2MB 失败。非常感谢任何帮助
编辑:正在上传的图片:
https://imgur.com/a/3TG9rLt
对于其他失去理智的人 - 使用各种不同的文件进行测试 - 文件大小似乎以位为单位恢复。
我有以下型号:
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 KB。当我在我的 'file_size' 方法中放置一个 binding.pry 时,我可以看到 attachment.size return 一个超过 1MB 的值:
pry(#<Asset>)> attachment.size.to_f
=> 2481189.0
这个值是以字节为单位 return编辑的吗?如果位显示它是实际文件大小的一半(这可能是由于压缩魔术)但我假设它会 return 字节..
我的方法每次都失败,除非我增加最大文件大小:
def max_file_size
3.0
end
将其设置为 3MB 即可通过验证。 2MB 失败。非常感谢任何帮助
编辑:正在上传的图片: https://imgur.com/a/3TG9rLt
对于其他失去理智的人 - 使用各种不同的文件进行测试 - 文件大小似乎以位为单位恢复。