我刚刚开始使用resque对后台的一些非常大的文件进行处理,而我无法弄清楚如何将文件传递给resque worker。我使用rails来处理文件上传,rails为从表单上传的每个文件创建一个ActionDispatch::Http::UploadedFile
对象。
如何将此文件发送给resque工作人员?我尝试发送一个只有临时文件的路径名和原始文件名的自定义哈希,但我不能再重新打开resque worker中的临时文件(只是一个普通的Errno::ENOENT - No such file or directory
)因为rails似乎删除了那个临时文件请求结束后。
答案 0 :(得分:6)
Http::UploadedFile
无法访问。您需要在某处编写文件(或使用s3作为临时存储)。传递resque您编写的文件的路径。
答案 1 :(得分:5)
我花了两天时间试图做到这一点并最终弄明白了。您需要对文件进行Base64编码,以便将其序列化为json。然后你需要在worker中解码它并创建一个新的
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