Helpex - Trao đổi & giúp đỡ Đăng nhập
6

Tôi vừa mới bắt đầu sử dụng resque để thực hiện một số xử lý trên một số tệp rất lớn trong nền và tôi đang gặp khó khăn khi tìm cách chuyển tệp cho resque worker. Tôi sử dụng rails để xử lý việc tải lên tệp và rails tạo một ActionDispatch::Http::UploadedFileđối tượng cho mỗi tệp được tải lên từ biểu mẫu.

Làm cách nào để gửi tệp này đến một nhân viên phục vụ? Tôi đã thử gửi một hàm băm tùy chỉnh chỉ gồm tên đường dẫn của tệp tạm thời và tên tệp gốc, nhưng tôi không thể mở lại tệp tạm thời trong resque worker nữa (chỉ là bình thường Errno::ENOENT - No such file or directory) vì rails dường như xóa tệp tạm thời đó sau khi yêu cầu kết thúc.

6 hữu ích 0 bình luận 2.4k xem chia sẻ
6

Http::UploadedFilekhông thể truy cập sau khi yêu cầu kết thúc. Bạn cần ghi tệp vào đâu đó (hoặc sử dụng s3 làm bộ lưu trữ tạm thời). Truyền lại đường dẫn đến tệp bạn đã viết.

6 hữu ích 1 bình luận chia sẻ
5

Tôi chỉ dành hai ngày để cố gắng làm điều này và cuối cùng đã tìm ra nó. Bạn cần mã hóa tệp Base64 để nó có thể được tuần tự hóa thành json. Sau đó, bạn cần giải mã nó trong worker và tạo một

ActionDispatch::Http::UploadedFile

Đây là cách mã hóa và chuyển để đặt lại:

// 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)  

Và đây là cách giải mã và chuyển đổi trở lại một đối tượng trong worker của bạn

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
5 hữu ích 2 bình luận chia sẻ
loading
Không tìm thấy câu trả lời bạn tìm kiếm? Duyệt qua các câu hỏi được gắn thẻ ruby-on-rails file-upload resque , hoặc hỏi câu hỏi của bạn.

Có thể bạn quan tâm

loading