0

我正在开发一个 Rails 应用程序,以将我存储在 Amazon S3 上的 Word 文件发送到convertapi以转换为 PDF。我正在使用回形针 gem来管理文件,并使用遏制 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

我正在尝试按照此处的遏制文档进行操作。

当我从 rails 控制台运行它时,它只是返回true. 我想捕获生成的 PDF。

(我已经验证,如果我在 convertapi 的测试端点工具上手动上传文件,这可以工作。)

更新 09.18.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)

4

2 回答 2

1

这是如何将遏制用于多部分发布请求的正确方法:

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

祝你今天过得愉快

于 2015-09-14T13:33:32.253 回答
1

原来问题很简单。convertapi 的 Word 到 PDF 转换工具需要带有 Word 扩展名的文件。我在将文件获取到 S3 的过程中丢失了扩展名。( file.path = /var/folders/33/nzmm899s4jg21mzljmf9557c0000gn/T/open-uri20150918-13136-11z00lk) 我能够通过针对 convertapi web gui 测试从 S3 提取的一个实际文件来验证这一点。

理想情况下,我会确保在提交到 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
于 2015-09-20T22:53:47.577 回答