2011-08-08 5 views
5

백그라운드에서 일부 매우 큰 파일에 대해 resque를 사용하기 시작했으며 파일을 resque 작업자에게 전달하는 방법을 찾지 못했습니다. 레일을 사용하여 파일 업로드를 처리하고 레일스는 양식에서 업로드 된 각 파일에 대해 ActionDispatch::Http::UploadedFile 개체를 만듭니다.업로드 된 파일을 보내서 처리 할 작업자를 다시 처리하십시오.

이 파일을 어떻게 작업자에게 보내시겠습니까? 임시 파일 및 원래 파일 이름의 경로 이름에 대한 사용자 지정 해시를 보내려고했으나 요청이 끝난 후 레일스가 임시 파일을 삭제하는 것처럼 보이기 때문에 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

파일을 몇 백 킬로바이트 이상으로 만들지 않는 한이 작업을 수행하지 않는 것이 좋습니다. 디스크/s3/etc에 파일을 쓰고 Resque 작업에 해당 경로를 전달하는 것이이 문제를 처리하는 올바른 방법입니다. – pnomolos

+0

@pnomolos와 대용량 파일에는 좋지 않음에 동의하지만, S3에 업로드하는 번거 로움이없는 작은 파일 (예 : 5-10KB CSV)을 다루는 경우 영리한 해킹입니다. - 필요할 때 다운로드 할 수 있습니다. – ACIDSTEALTH

관련 문제