class Dato::Upload::CreateUploadPath

Attributes

client[R]
source[R]

Public Class Methods

new(client, source) click to toggle source
# File lib/dato/upload/create_upload_path.rb, line 13
def initialize(client, source)
  @client = client
  @source = source
end

Public Instance Methods

download_file(url) click to toggle source
# File lib/dato/upload/create_upload_path.rb, line 65
def download_file(url)
  connection = Faraday.new do |c|
    c.response :raise_error
    c.use FaradayMiddleware::FollowRedirects
    c.adapter :net_http
  end
  connection.get(url).body
rescue Faraday::Error => e
  puts "Error during upload of #{url}: #{e.message}"
  raise e
end
file() click to toggle source
# File lib/dato/upload/create_upload_path.rb, line 18
def file
  @file ||= if http_source?
              uri = Addressable::URI.parse(source)
              ext = ::File.extname(uri.path).downcase
              tempfile = Tempfile.new(["file", ext])
              tempfile.binmode
              tempfile.write(download_file(source))
              tempfile.rewind
              tempfile
            else
              ::File.new(::File.expand_path(source))
            end
end
filename() click to toggle source
# File lib/dato/upload/create_upload_path.rb, line 39
def filename
  if http_source?
    ::File.basename(source)
  else
    ::File.basename(file.path)
  end
end
http_source?() click to toggle source
# File lib/dato/upload/create_upload_path.rb, line 32
def http_source?
  uri = Addressable::URI.parse(source)
  uri.scheme == "http" || uri.scheme == "https"
rescue Addressable::URI::InvalidURIError
  false
end
upload_path() click to toggle source
# File lib/dato/upload/create_upload_path.rb, line 47
def upload_path
  upload_request = client.upload_request.create(filename: filename)
  uri = URI.parse(upload_request[:url])

  mime_type = MIME::Types.of(filename).first

  request = Net::HTTP::Put.new(uri)
  request.add_field("Content-Type", mime_type.to_s) if mime_type
  request.body = file.read

  http = Net::HTTP.new(uri.host, uri.port)
  http.use_ssl = true

  http.request(request)

  upload_request[:id]
end