加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

Rails一个简单的文件上传类,仅上传文件

发布时间:2020-12-17 04:07:27 所属栏目:百科 来源:网络整理
导读:今天PHP站长网 52php.cn把收集自互联网的代码分享给大家,仅供参考。 #encoding: utf-8require 'fileutils'class UploadException RuntimeError; end#上传文件class UploadFile def initialize(configs) @upload_path = "

以下代码由PHP站长网 52php.cn收集自互联网

现在PHP站长网小编把它分享给大家,仅供参考

#encoding: utf-8
require 'fileutils'
class UploadException < RuntimeError; end
#上传文件
class UploadFile
  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: 0766) unless File.directory? @upload_path
    FileUtils.chmod(0766,@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

  def upload(file)
    raise UploadException,'文件不是图片格式' if @type == 'image' && !self.is_image?(file)
    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))
    file_path = generage_file_name file.original_filename
    File.open(file_path,'wb') do |f|
      f.write file.read
    end
  rescue Exception => e
    raise UploadException,'文件上传失败:' + e.message
  else
    {file_name: file_name,file_size: file_size,file_path: file_path}
  end


  protected

  def generage_file_name(original_filename)
    if original_filename
      filename = SecureRandom.uuid + File.extname(original_filename)
      if File.exist? filename
        generage_file_name(original_filename)
      else
        File.join(random_dir,filename)
      end
    end
  end

  def is_image?(file)
    `file --mime -b #{file.tempfile.path}` =~ /^image/
  end

  def config_keys
    [:upload_path,:max_size,:type,:random_dir]
  end

  def upload_path=(path)
    @upload_path = path
  end

  def max_size=(size)
    @max_size = size
  end

  def type=(type)
    @type = type
  end


  def random_dir=(random_dir)
    @random_dir = random_dir
  end

  def random_dir?
    @random_dir
  end

  def check_and_mkdir(dir)
    dir_name = File.join(@upload_path,dir.to_s)
    Dir.mkdir(dir_name) unless File.directory? dir_name
    File.new(dir_name,'w').chmod(0766)
  end

  def random_dir
    random_dir? ? File.join(@upload_path,((0..9).to_a + ('a'..'z').to_a).sample) : @upload_path
  end
end

以上内容由PHP站长网【52php.cn】收集整理供大家参考研究

如果以上内容对您有帮助,欢迎收藏、点赞、推荐、分享。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读