2

このガイドに従って、AJAX を介してドラッグ アンド ドロップでファイルをアップロードしました

WebBrick を使用した開発環境ではすべてが正常に機能していましたが、PhusionPassenger にデプロイすると、次のようになります。

Paperclip::AdapterRegistry::NoHandlerError (No handler found for #<PhusionPassenger::Utils::RewindableInput:0x000000041aef38 @io=#<PhusionPassen...

私はコントローラーでこれを使用しています:

before_filter :parse_raw_upload, :only => :bulk_submissions

def bulk_submissions
    ...
    @submission = Submission.create!(url: "", file: @raw_file, description: "Please edit this description", work_type: "other", date_completed: DateTime.now.to_date)  

    ...      
end

private
def parse_raw_upload

  if env['HTTP_X_FILE_UPLOAD'] == 'true'
     @raw_file = env['rack.input']
     @raw_file.class.class_eval { attr_accessor :original_filename, :content_type }
     @raw_file.original_filename = env['HTTP_X_FILE_NAME']
     @raw_file.content_type = env['HTTP_X_MIME_TYPE']
  end
end

リクエスト自体を見ると、すべてのヘッダーが設定されています (X_MIME_TYPE、X_FILE_NAME) など。

何か案は?

前もって感謝します!

4

1 に答える 1

3

あなたが引用している例では、ファイル ストリームが StringIO オブジェクトであると想定していますが、Passenger は代わりに PhusionPassenger::Utils::RewindableInput オブジェクトを提供しています。

幸いなことに、この場合、RewindableInput は StringIO と似ているため、Paperclip の StringioAdapter を使用してアップロード ストリームをラップできます。

parse_raw_upload の if ブロック内で、最後に次のようにします。

if @raw_file.class.name == 'PhusionPassenger::Utils::RewindableInput'
  @raw_file = Paperclip::StringioAdapter.new(@raw_file)
end
于 2013-03-20T01:07:26.523 に答える