def traverse_params_hash(hash, result = nil, current_key = nil)
result ||= { :files => [], :params => [] }
hash.keys.sort { |a, b| a.to_s <=> b.to_s }.collect do |key|
new_key = (current_key ? "#{current_key}[#{key}]" : key).to_s
case hash[key]
when Hash
traverse_params_hash(hash[key], result, new_key)
when Array
hash[key].each do |v|
result[:params] << [new_key, v.to_s]
end
when File, Tempfile
filename = File.basename(hash[key].path)
types = MIME::Types.type_for(filename)
result[:files] << [
new_key,
filename,
types.empty? ? 'application/octet-stream' : types[0].to_s,
File.expand_path(hash[key].path)
]
else
result[:params] << [new_key, hash[key].to_s]
end
end
result
end