Ruby 用の Amazon S3 API は、ブロックを read メソッドに渡すときにオブジェクトのみをストリーミングします。em-ftpd 用のドライバーを開発していますが、S3 データをクライアントにストリーミングするには IOish オブジェクトが必要です。単純に myS3Object.read を渡すと、S3 API で規定されているように、ファイル全体がメモリにロードされます。それをカスタム IO クラスのようなものにカプセル化して、ストリームを em-ftpd に渡す方法はありますか?
これが私のコードです:
def get_file(path)
#loading whole file into memory - not efficient
yield bucket.objects[path].read
end
これは、ブロックを使用してデータ チャンクを取得する、できれば IOish オブジェクトとして、コードの結果を取得する em-ftpd 内のコードです。
# send a file to the client
def cmd_retr(param)
send_unauthorised and return unless logged_in?
send_param_required and return if param.nil?
path = build_path(param)
@driver.get_file(path) do |data|
if data
send_response "150 Data transfer starting #{data.size} bytes"
send_outofband_data(data)
else
send_response "551 file not available"
end
end
end
ありがとうございました。