2011-08-08 7 views
5

私は、resqueを使用して、バックグラウンドで非常に大きなファイルをいくつか処理していましたが、ファイルをresque workerに渡す方法がわかりません。私はファイルのアップロードを処理するためにレールを使い、レールはフォームからアップロードされたファイルごとにActionDispatch::Http::UploadedFileオブジェクトを作成します。アップロードされたファイルを処理して処理する作業者を返す

どのようにこのファイルをresqueワーカーに送信しますか?私は、一時ファイルと元のファイル名のパス名のカスタムハッシュを送信しようとしましたが、要求が終了した後にレールがその一時ファイルを削除するように見えるため、resqueワーカーで一時ファイルをもう一度開くことはできません(ただ普通のErrno::ENOENT - No such file or directory)。 。

答えて

5

Http::UploadedFileは、要求が完了するとアクセスできません。ファイルをどこかに書き込む必要があります(または、一時記憶域としてs3を使用する)。書き込んだファイルへのパスを再入力します。

+0

唯一の方法のようです。私はちょうど処理する前にファイルの移動を処理し、後で削除することを望んでいませんでした。ありがとう。 –

5

私はちょうど2日を費やしてこれをやろうとしましたが、やっとそれを理解しました。 jsonにシリアル化できるように、Base64でファイルをエンコードする必要があります。次に、あなたが労働者にそれをデコードして作成する必要が新しい

ActionDispatch::Http::UploadedFile

ここ

エンコードとresqueに渡す方法は次のとおりです。

// You only need to encode the actual file, everything else in the 
// ActionDispatch::Http::UploadedFile object is just string or a hash of strings 

file = params[:file] // Your ActionDispatch::Http::UploadedFile object 
file.tempfile.binmode 
file.tempfile = Base64.encode64(file.tempfile.read) 

Resque.enqueue(QueueWorker, params) 

を、ここでデコードして、内のオブジェクトに戻って変換する方法ですあなたの労働者

class QueueWorker 
    @queue = :main_queue 

    def self.perform(params) 
     file = params['file'] 
     tempfile = Tempfile.new('file') 
     tempfile.binmode 
     tempfile.write(Base64.decode64(file['tempfile'])) 

     // Now that the file is decoded you need to build a new 
     // ActionDispatch::Http::UploadedFile with the decoded tempfile and the other 
     // attritubes you passed in. 

     file = ActionDispatch::Http::UploadedFile.new(tempfile: tempfile, filename: file['original_filename'], type: file['content_type'], head: file['headers']) 

     // This object is now the same as the one in your controller in params[:file] 
    end 
end 
+3

あなたのファイルが決して数百KBを超えることがないと確信しない限り、これを行うことはお勧めしません。ファイルをdisk/s3/etcに書き込んで、そのパスをResqueジョブに渡すことは、これを処理する適切な方法です。 – pnomolos

+0

@pnomolosには大容量のファイルには適していないとはっきりと同意しますが、S3にアップロードするという面倒な価値のない小さなファイル(例:5-10KB CSV)を扱う場合は巧妙なハックです - 必要なときにそれらをダウンロードします。 – ACIDSTEALTH

関連する問題