1. 程式人生 > >【Ceph】基於Tornado的Ceph檔案上傳與下載及線上預覽

【Ceph】基於Tornado的Ceph檔案上傳與下載及線上預覽

概述

  • 用tornado作為http伺服器
  • 在處理post/get請求的方法中,呼叫librados(python)介面實現讀寫
  • 設定Content-disposition中為inline則線上瀏覽,attachment則下載

上傳

#!/usr/bin/env python
# -*- coding: UTF-8 -*-
import tornado.ioloop
import tornado.web
import os
import rados

class UploadFileHandler(tornado.web.RequestHandler):
    def get(self)
:
self.write(''' <html> <head><title>Upload File</title></head> <body> <form action='file' enctype="multipart/form-data" method='post'> <input type='file' name='file'/><br/> <input type='submit' value='submit'/> </form> </body> </html> '''
) def post(self): # 將上傳檔案寫入到test池中 cluster = rados.Rados(conffile='/etc/ceph/ceph.conf') cluster.connect() ioctx = cluster.open_ioctx('test') file_metas=self.request.files['file'] for meta in file_metas: filename=meta['filename'] ioctx.write_full(filename, meta['body'
]) ioctx.close() self.write('finished!') app=tornado.web.Application([ (r'/file',UploadFileHandler), ]) if __name__ == '__main__': app.listen(3000) tornado.ioloop.IOLoop.instance().start()

下載

#!/usr/bin/env python
# -*- coding: UTF-8 -*-

import tornado.ioloop
import tornado.web
import os
import rados

class DownloadFileHandler(tornado.web.RequestHandler):
    def get(self, filename):
        print('downloading... : ',filename)

        cluster = rados.Rados(conffile='/etc/ceph/ceph.conf')
        cluster.connect()
        ioctx = cluster.open_ioctx('test')

        self.set_header ('Content-Type', 'application/octet-stream')
        self.set_header ('Content-Disposition', 'attachment; filename='+filename)

        size, timestamp = ioctx.stat(filename)

        pagesize = 1024*1024
        offset = 0
        if pagesize > size:
            pagesize = size

        while offset < size:
            data = ioctx.read(filename, pagesize, offset)
            self.write(data)
            offset += pagesize

        ioctx.close()
        self.finish()



app=tornado.web.Application([
    (r'/download/(.*)', DownloadFileHandler),
])

if __name__ == '__main__':
    app.listen(3000)
    tornado.ioloop.IOLoop.instance().start()

線上預覽

#!/usr/bin/env python
# -*- coding: UTF-8 -*-

import tornado.ioloop
import tornado.web
import os
import rados
import mimetypes


class DownloadFileHandler(tornado.web.RequestHandler):
    def get(self, filename):
        print('downloading... : ',filename)

        cluster = rados.Rados(conffile='/etc/ceph/ceph.conf')
        cluster.connect()
        ioctx = cluster.open_ioctx('music')

        ctype = mimetypes.guess_type(filename)[0]

        self.set_header ('Content-Type', ctype)
        self.set_header ('Content-Disposition', 'inline; filename='+filename)

        size, timestamp = ioctx.stat(filename)

        pagesize = 1024*1024
        offset = 0
        if pagesize > size:
            pagesize = size

        while offset < size:
            data = ioctx.read(filename, pagesize, offset)
            self.write(data)
            offset += pagesize

        ioctx.close()
        self.finish()



app=tornado.web.Application([
    (r'/download/(.*)', DownloadFileHandler),
])

if __name__ == '__main__':
    app.listen(3000)
    tornado.ioloop.IOLoop.instance().start()