上传/发布stringIO作为文件

时间:2017-11-02 22:59:38

标签: ruby http carrierwave

我想将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请求,以使其行为像文件

任何想法?

1 个答案:

答案 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相关的链接:

https://github.com/carrierwaveuploader/carrierwave/wiki/How-to:-Upload-from-a-string-in-Rails-3-or-later

和像对象一样的样本包装器

  class StringIOWrapper < StringIO
    attr_accessor :original_filename
  end

之后这将起作用

myObject.fileUploader = StringIOWrapper.new(params[:file])
myObject.save