2014-02-17 1 views
1

Можно ли подключать загрузку файла с помощью рубина?Как я могу передать загрузку файлов в стойку непосредственно на S3?

Вместо того, чтобы читать весь файл в памяти или записывать временный файл для записи на S3, я надеялся напрямую передать тело запроса.

Streaming data to S3 with ruby показывает, как переходить на S3, но я не уверен, как превратить тело запроса в приложение для стойки в читаемый поток.

class FastUploadApp 
    def self.call(env) 
    # what goes here? 
    end 
end 

ответ

1

Вы совершенно правы, что вам нужно превратить тело запроса в читаемый поток. В частности, S3 ожидает класс ввода-вывода Ruby (в том, что ему нужен метод #read и метод #eof?). У органов запроса стойки нет? определенно, однако, так что вы должны сделать маленький класс обертки:

class RackS3Wrapper 
    def initialize(body) 
    @body = body 
    @eof = false 
    end 

    def read(*args) 
    ret = @body.read(*args) 

    if ret == nil or ret == "" 
     @eof = true 
    end 

    ret 
    end 

    def eof? 
    @eof 
    end 
end 

Затем вы можете использовать эту оболочку для потоковой передачи запроса на S3 непосредственно:

s3.buckets['com.mydomain.mybucket'].objects['filename'].write(
    :data => RackS3Wrapper.new(request.body), 
    :content_length => request.env['CONTENT_LENGTH'].to_i) 

Это не было испытано в производстве или что-то еще, но оно должно работать нормально.

+0

огромных ! я буду работать над этим в течение следующих нескольких дней – AJcodez

1

Проверьте мой проект middl: https://github.com/diclophis/middl

Он имеет некоторые оговорки ... в основном вы должны полагаться на клиенте, отправив заголовок соответствующего размера запроса (который не требуется в w3 спецификации)

Смежные вопросы