2017-11-02 6 views
0

stringIOをファイルとしてサーバーにアップロードしたいとします。 私は要求をするためにレールを使用していません。ルビーといくつかの宝石だけです。 私は以下のようにStringIOを作成しました:アップロード/ポストストリングIOファイル

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を正しく処理するのではなく、正直なところ、投稿要求にどのように渡してファイルのように振るべきか正確には分かりません。

アイデア?

+0

何をしていきますオブジェクト

class StringIOWrapper < StringIO attr_accessor :original_filename end 

よう

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

とサンプルラッパーをヘッダーは送信していますか?このエラーメッセージは、あなたのPOSTヘッダが正しくないと思うようになります。特に、content-typeです。サーバーはどのコンテンツタイプを受け入れますか? – Tom

+0

はヘッダーに関連していない問題が判明しました。私の答えは以下を参照してください。うまくいけばそれは将来誰かを助けるでしょう – beniutek

答えて

0

私はファイルとしてzipを保存していなかったので、これはstringIOで応答するwrite_bufferを使用していたので、これが起こっていました。

た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 

をけれどもたStringIOオブジェクトが持っていないので、それは動作しませんoriginal_filenameメソッドは、Rails3以来(これまでキャリアウェーブの問題ページから理解していました)

解決策は、StringIOの周りにラッパーを作成し、その後にファイルが正しく保存されているoriginal_filenameという属性またはメソッドを追加することでした。

私はこれを扱うcarrierwaveウィキへのリンクを掲載しています:その後、これは

myObject.fileUploader = StringIOWrapper.new(params[:file]) 
myObject.save 
関連する問題