我想将stringIO作为文件上传到服务器。 我没有使用rails来提出请求,只是使用ruby和一些宝石。 我创建了一个如下所示的字符串:
require 'rest-client'
require 'zip'
... some code
stream = Zip::OutputStream::write_buffer do |zip|
... code that download files and packs them
end
stream.rewind
RestClient.post('somepath', { file: stream.read }, headers)
RestClient只是一些方便的宝石,它使发送http请求更容易一些。 所以我的问题是,当我收到请求时,在控制器的服务器端,我收到错误
ArgumentError - invalid byte sequence in UTF-8:
activesupport (4.2.6) lib/active_support/core_ext/object/blank.rb:117:in `blank?'
carrierwave (0.10.0) lib/carrierwave/sanitized_file.rb:127:in `is_path?'
carrierwave (0.10.0) lib/carrierwave/sanitized_file.rb:93:in `size'
carrierwave (0.10.0) lib/carrierwave/sanitized_file.rb:136:in `empty?'
carrierwave (0.10.0) lib/carrierwave/uploader/cache.rb:119:in `cache!'
carrierwave (0.10.0) lib/carrierwave/mount.rb:329:in `cache'
carrierwave (0.10.0) lib/carrierwave/mount.rb:163:in `export='
carrierwave (0.10.0) lib/carrierwave/orm/activerecord.rb:39:in `export='
app/controllers/exports_controller.rb:17:in `upload'
(我使用carrierwave存储文件)
我认为我没有正确处理stringIO,但老实说,我不知道应该如何将其传递给post请求,以使其行为像文件
任何想法?
答案 0 :(得分:0)
结果发生了这种情况,因为我没有将zip保存为文件,而是使用write_buffer
响应stringIO。
stringIO read
方法返回一个上传到我的控制器的字符串,然后我尝试使用carrierwave保存文件大致如下:
... code in my controller
myObject = ObjectModel.find(params[:id])
myObject.fileUploader = StringIO.new(params[:file]) => this was the string i received from stringIO read method
myObject.save
但它不起作用,因为自Rails3以来,StringIO对象不再具有original_filename
方法(据我所知,载波问题页面)
解决方案是在StringIO周围创建一个包装器,然后添加一个名为original_filename
的属性或方法,然后正确保存文件。
我发布了与carrierwave wiki相关的链接:
和像对象一样的样本包装器
class StringIOWrapper < StringIO
attr_accessor :original_filename
end
之后这将起作用
myObject.fileUploader = StringIOWrapper.new(params[:file])
myObject.save