Использование curb (жемчужина рельсов) для преобразования файла с convertapi

Я работаю над приложением Rails для отправки файлов Word, хранящихся на Amazon S3, в convertapi для преобразования в PDF-файлы. . Я использую жемчужину скрепки для управления файлами, а curb gem, чтобы сделать фактический запрос.

# model with property has_attached_file :attachment
def convert_docx_to_pdf
    base = "https://do.convertapi.com/Word2Pdf" 
    api_key = '*****'
    file = open(attachment.url)
    c = Curl::Easy.new(base)
    c.multipart_form_post = true
    c.http_post(
      Curl::PostField.file('thing[file]', file.path), 
      Curl::PostField.content('ApiKey', api_key)
    )
end

Я пытаюсь следовать документации для curb здесь.

Когда я запускаю это из консоли rails, он просто возвращает true. Я хотел бы захватить полученный PDF.

(Я убедился, что это работает, если я загружаю файл вручную с помощью инструмента тестирования конечной точки от convertapi. .)

ОБНОВЛЕНИЕ 18.09.15

Я реализовал изменения, предложенные Йонасом. Вот новый код:

def convert_docx_to_pdf
  base = "https://do.convertapi.com/Word2Pdf"
  api_key = ENV['CONVERTAPI_API_KEY']
  file = open(attachment.url)

  Curl::Easy.new('https://do.convertapi.com/Word2Pdf') do |curl|
    curl.multipart_form_post = true
    curl.http_post(Curl::PostField.content('ApiKey', api_key), Curl::PostField.file('File', file.path))

    return curl.body_str
  end
end

Все еще не повезло, curl.body_str возвращает только "Bad Request".

(file.path = /var/folders/33/nzmm899s4jg21mzljmf9557c0000gn/T/open-uri20150918-13136-11z00lk)


person lostphilosopher    schedule 14.09.2015    source источник
comment
Почему вы делаете file = open(attachment.url) и последний file.path? Что было бы, если бы вы использовали Curl::PostField.file('File', attachment.url)?   -  person Jonas    schedule 20.09.2015
comment
@ Джонас, это тоже не работает, но, возможно, это понятно, поскольку attachment.url - это просто строка. API ожидает файловый объект, и именно здесь появляется file = open(attachment.url).   -  person lostphilosopher    schedule 21.09.2015


Ответы (2)


это правильный способ использования curb для многостраничных почтовых запросов:

Curl::Easy.new('https://do.convertapi.com/Word2Pdf') do |curl|
  curl.multipart_form_post = true
  curl.http_post(Curl::PostField.content('ApiKey', 'xxxxxxxxx'), Curl::PostField.file('File', 'test.docx'))
  File.write('out.pdf', curl.body_str)
end

Хорошего дня

person Jonas    schedule 14.09.2015
comment
Большое спасибо за вашу помощь, я внедрил предложенные вами изменения, но не повезло (см. Обновление для публикации). - person lostphilosopher; 19.09.2015

Оказалось, проблема была проста. Инструмент конвертации Word в PDF convertapi ожидает файлы с расширениями Word. Я потерял расширение в процессе получения файла на S3. (file.path = /var/folders/33/nzmm899s4jg21mzljmf9557c0000gn/T/open-uri20150918-13136-11z00lk) Я смог убедиться в этом, протестировав один из моих реальных файлов, извлеченных из S3, с помощью веб-интерфейса convertapi.

В идеале я бы позаботился о том, чтобы не потерять расширение при отправке на S3, но в то же время следующий код делает свое дело:

def convert_docx_to_pdf
  base = "https://do.convertapi.com/Word2Pdf"
  api_key = ENV['CONVERTAPI_API_KEY']
  file = open(attachment.url)
  local_file_path = "#{file.path}.docx"
  FileUtils.cp(file.path, local_file_path) # explicitly set the extension portion of the string

  Curl::Easy.new('https://do.convertapi.com/Word2Pdf') do |curl|
    curl.multipart_form_post = true
    binding.pry
    curl.http_post(Curl::PostField.content('ApiKey', api_key), Curl::PostField.file('File', local_file_path))

    # Write to PDF opened in Binary (I got better resulting PDFs this way)
    f = File.open('public/foo.pdf', 'wb')
    f.write(curl.body_str)
    f.close
  end
  FileUtils.rm(local_file_path)
end
person lostphilosopher    schedule 20.09.2015