ruby-on-rails Rails 7创建pdf临时文件并在POST中发送

ryhaxcpt  于 2022-12-15  发布在  Ruby
关注(0)|答案(1)|浏览(119)

在我的Rails 7 API应用中,我正在用gem Prawn创建一个PDF文件。创建后,我想将该文件保存到Tempfile中,然后通过POST调用将其发送到外部服务。要将文件附加到POST调用中,我必须使用Faraday::UploadIO。不幸的是,我无法创建Tempfile并将其传递到Net::HTTP客户端。
这是我的想法:
lib/file_io.rb

# require 'file_io' and use FileIO to simplify persistence of IO stream as file
class FileIO < StringIO
  attr_reader :original_filename

  def initialize(stream, filename)
    super(stream)
    @original_filename = filename
  end
end

services/mandate/uploader.rb

# class which generates PDF and send it to the API

require 'file_io'
require 'net/http'

module Mandate
  class Uploader
    def send_pdf_file(file_io)
      uri = URI('test_path')
      req = Net::HTTP::Post.new(uri)
      req['apiToken'] = Rails.application.credentials.api_token
      req['Content-Type'] = 'multipart/form-data'
      file = Tempfile.new('mandate.pdf')
      file.write(file_io.read)
      file.close
      req.set_form([['file', Faraday::UploadIO.new(file.path, 'application/pdf')]], 'multipart/form-data')
      res = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) do |http|
        http.request(req)
    end

    def generate_pdf(params)
      FileIO.new(PDFDocument::Generator.new(params).render, 'document.pdf')
    end
  end
end

这段代码产生了一个错误:
库/ruby/3.1.0/委托.rb:349:在“写入”中:“\xFF”从ASCII-8BIT转换为UTF-8(编码::未定义转换错误)
我已尝试通过以下方式强制对文件进行编码:

file.write(file_io.read.force_encoding('ASCII-8BIT'))

但错误消息是相同的。

yhived7q

yhived7q1#

要修复此错误,可以尝试以下操作:
通过调用file对象上的set_encoding方法,在写入文件之前设置文件的编码:

file = Tempfile.new('mandate.pdf') 
file.set_encoding('ASCII-8BIT') 
file.write(file_io.read) 
file.close

使用binmode方法设置文件对象的二进制编码:

file = Tempfile.new('mandate.pdf') 
file.binmode 
file.write(file_io.read) 
file.close

将数据写入文件时,请使用write_binary方法而不是write方法:

file = Tempfile.new('mandate.pdf') 
file.write_binary(file_io.read) 
file.close

在将文件数据写入文件之前,使用ascii_only?方法检查文件数据是否仅为ASCII:

file = Tempfile.new('mandate.pdf') 
if file_io.read.ascii_only?   
  file.write(file_io.read) 
else   
  raise "File data is not ASCII-only" 
end 
file.close

通过执行这些步骤,您应该能够将文件数据写入临时文件,而不会遇到Encoding::UndefinedConversionError错误。

相关问题