使用 curb (rails gem) 通过 convertapi 转换文件
Using curb (rails gem) to convert a file with convertapi
我正在开发一个 Rails 应用程序,用于将我存储在 Amazon S3 上的 Word 文件发送到 convertapi for conversion into PDFs. I'm using the paperclip gem to manage the files, and the 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 here 的文档进行操作。
当我从 rails 控制台 运行 时,它只是 returns true
。我想捕获生成的 PDF。
(我已验证如果我在 convertapi 的 test endpoint tool 上手动上传文件,此方法有效。)
更新 09.18.15
我实施了 Jonas 建议的更改。这是新代码:
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
returns 只是 "Bad Request"
。
(file.path = /var/folders/33/nzmm899s4jg21mzljmf9557c0000gn/T/open-uri20150918-13136-11z00lk
)
这是对多部分 post 请求使用 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
祝你有愉快的一天
原来问题很简单。 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
我正在开发一个 Rails 应用程序,用于将我存储在 Amazon S3 上的 Word 文件发送到 convertapi for conversion into PDFs. I'm using the paperclip gem to manage the files, and the 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 here 的文档进行操作。
当我从 rails 控制台 运行 时,它只是 returns true
。我想捕获生成的 PDF。
(我已验证如果我在 convertapi 的 test endpoint tool 上手动上传文件,此方法有效。)
更新 09.18.15
我实施了 Jonas 建议的更改。这是新代码:
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
returns 只是 "Bad Request"
。
(file.path = /var/folders/33/nzmm899s4jg21mzljmf9557c0000gn/T/open-uri20150918-13136-11z00lk
)
这是对多部分 post 请求使用 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
祝你有愉快的一天
原来问题很简单。 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