在我的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'))
但错误消息是相同的。
1条答案
按热度按时间yhived7q1#
要修复此错误,可以尝试以下操作:
通过调用file对象上的set_encoding方法,在写入文件之前设置文件的编码:
使用binmode方法设置文件对象的二进制编码:
将数据写入文件时,请使用write_binary方法而不是write方法:
在将文件数据写入文件之前,使用ascii_only?方法检查文件数据是否仅为ASCII:
通过执行这些步骤,您应该能够将文件数据写入临时文件,而不会遇到Encoding::UndefinedConversionError错误。