载波中的块点文件

Block dotfiles in carrierwave

我想允许通过载波上传器上传(所有可能的)图像文件。

不幸的是,.DS_STORE 等点文件可能会传递给上传者。我尝试添加明确的白名单以仅允许我知道的图像格式,但这没有帮助。

def extension_whitelist
  %w(jpg jpeg gif png)
end

还尝试 运行 所有文件通过正则表达式并且只允许匹配

def extension_whitelist
  [/^[^\.].*$/]
end

这也没有用。 添加黑名单也无济于事

def extension_blacklist
  %w(.ds_store .DS_STORE ds_store DS_STORE)
end

这是我的模型

class LocalImage < ActiveRecord::Base
  mount_uploader :image_file, ImageUploader
  process_in_background :image_file

  validates_integrity_of :image_file
end

这是有问题的上传者

class ImageUploader < CarrierWave::Uploader::Base
  include CarrierWave::MiniMagick
  include ::CarrierWave::Backgrounder::Delay

  storage :file

  def store_dir
    "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
  end
end

我添加了 backlist/whitelist 定义并对其进行了全面测试(在两者之间重新启动服务器以确保没有缓存问题)。还通过控制台进行了测试,但模型始终为 valid,并且在 create!ing 时不会抛出错误。

path = "path_to_file/.DS_STORE"
File.exists?(path) # => true

local_image = LocalImage.new(image_file: File.open(path, 'rb'))
local_image.valid? # => true
local_image.save! # => true

LocalImage.create!(image_file: File.open(path, 'rb'))
# => <LocalImage id: 22325, code: nil, image_id: nil, image_file: ".DS_STORE", created_at: "2018-02-02 11:19:25", updated_at: "2018-02-02 11:19:25", import_filename: ".ds_store">

运行

如前所述here方法extension_whitelist仅从0.11版本开始存在,所以我使用的版本还没有这个变化。 我可以通过将 carrierwave 升级到 0.11 或将我的 extension_whitelist 重命名为 extension_white_list 来修复验证。 (与 blacklist -> black_list 相同)。