class SimpleFileupload

上传文件

Public Class Methods

new(configs) click to toggle source
# File lib/simple_fileupload.rb, line 7
def initialize(configs)
  @upload_path = "#{Rails.root}/data"
  @type = @max_size = @random_dir = nil
  configs.each do |key, value|
    if config_keys.include? key
      self.send("#{key}=", value)
    end
  end
  FileUtils.mkdir(@upload_path, mode: 0777) unless File.directory? @upload_path
  FileUtils.chmod(0777, @upload_path) unless File.writable_real?(@upload_path)
  ((0..9).to_a + ('a'..'z').to_a).each &method(:check_and_mkdir) if random_dir?
end

Public Instance Methods

upload(file) click to toggle source
# File lib/simple_fileupload.rb, line 20
def upload(file)
  mime_type = get_mime_type file
  raise UploadException, '文件不是图片格式' if @type == 'image' && !mime_type_is_image?(mime_type)
  file_size = File.size file.tempfile
  file_name = file.original_filename
  raise UploadException, "文件大小超出限制的大小#{@max_size}" if (@max_size && file_size > @max_size.to_i)
  raise UploadException, "上传目录不是目录或不能写入" unless (File.directory?(@upload_path) && File.writable_real?(@upload_path))
  real_file_name = generage_file_name file.original_filename
  random_path = random_dir
  @upload_path = File.join(@upload_path, random_path) if random_path
  file_path = File.join(@upload_path, real_file_name)
  File.open(file_path, 'wb') do |f|
    f.write file.read
  end
rescue Exception => e
  raise UploadException, '文件上传失败:' + e.message
else
  {file_name: file_name, real_file_name: real_file_name, file_size: file_size, upload_path: @upload_path, file_full_path: file_path, mime_type: mime_type}
end

Protected Instance Methods

check_and_mkdir(dir) click to toggle source
# File lib/simple_fileupload.rb, line 90
def check_and_mkdir(dir)
  dir_name = File.join(@upload_path, dir.to_s)
  FileUtils.mkdir(dir_name, mode: 0777) unless File.directory? dir_name
  FileUtils.chmod(0777, dir_name)
end
config_keys() click to toggle source
# File lib/simple_fileupload.rb, line 65
def config_keys
  [:upload_path, :max_size, :type, :random_dir]
end
generage_file_name(original_filename) click to toggle source
# File lib/simple_fileupload.rb, line 42
def generage_file_name(original_filename)
  if original_filename
    filename = SecureRandom.uuid + File.extname(original_filename)
    if File.exist? File.join(@upload_path, filename)
      generage_file_name(original_filename)
    else
      filename
    end
  end
end
get_mime_type(file) click to toggle source
# File lib/simple_fileupload.rb, line 57
def get_mime_type(file)
  `file --mime -b #{file.tempfile.path}`
end
is_image?(file) click to toggle source
# File lib/simple_fileupload.rb, line 53
def is_image?(file)
  get_mime_type(file) =~ /^image/
end
max_size=(size) click to toggle source
# File lib/simple_fileupload.rb, line 73
def max_size=(size)
  @max_size = size
end
mime_type_is_image?(mime_type) click to toggle source
# File lib/simple_fileupload.rb, line 61
def mime_type_is_image?(mime_type)
  mime_type =~ /^image/
end
random_dir() click to toggle source
# File lib/simple_fileupload.rb, line 96
def random_dir
  random_dir? ? ((0..9).to_a + ('a'..'z').to_a).sample : nil
end
random_dir=(random_dir) click to toggle source
# File lib/simple_fileupload.rb, line 82
def random_dir=(random_dir)
  @random_dir = random_dir
end
random_dir?() click to toggle source
# File lib/simple_fileupload.rb, line 86
def random_dir?
  @random_dir
end
type=(type) click to toggle source
# File lib/simple_fileupload.rb, line 77
def type=(type)
  @type = type
end
upload_path=(path) click to toggle source
# File lib/simple_fileupload.rb, line 69
def upload_path=(path)
  @upload_path = path
end