class ActiveAdmin::JfuUpload::Engine

Public Class Methods

upload_file( request, param, resource, field ) click to toggle source
# File lib/activeadmin/jfu_upload/engine.rb, line 11
def upload_file( request, param, resource, field )
  response = { result: 0 }
  if !param.blank?
    if request.headers['CONTENT-RANGE'].blank?
      resource.update field => param
      response = { result: 1, file_name: resource.try( field ).try( :url ) }
    else
      m = request.headers['CONTENT-RANGE'].match(%r{[^\s]+\s(\d+)-(\d+)/(\d+)})
      if m
        buffer = param.read
        pos = m[1].to_i
        if pos == 0
          tempfile = Rails.root.join('tmp', "upload_#{Time.now.to_i}_#{resource.id}_#{field}")
          field_data = { original_filename: param.original_filename, tempfile: tempfile }
          # dir.mkdir unless File.exists?(dir)
          # field_data = { original_filename: param.original_filename, tempfile: dir.join(param.tempfile).to_s }
          # # alternative: "#{resource.class.to_s.tableize}_#{resource.id}_#{Time.now.to_i}"
          resource.update_column field, YAML.dump(field_data)
          mode = 'wb'
        else
          field_data = YAML.load resource.read_attribute(field) # rubocop:disable Security/YAMLLoad
          mode = 'ab'
        end
        File.open(field_data[:tempfile], mode) { |f| f.write(buffer) }
        if ( m[2].to_i + 1 ) == m[3].to_i
          path = Pathname.new field_data[:tempfile]
          dst = path.dirname.join(field_data[:original_filename]).to_s
          File.rename(field_data[:tempfile], dst)
          resource.send("#{field}=", File.open(dst))
          resource.save
          response = { result: 1, pos: m[3].to_i, file_name: resource.try(field).try(:url) }
        else
          response = { result: 2, position: pos }
        end
      end
    end
  end
  response
end