在web开发过程中,文件上传是经常用到的功能,比如上传附件,上传照片等。下面我们来介绍一下利用tornado 来实现简单的文件上传功能。
Tornado 自身是不支持大文件上传的。对于接收到的文件,它会把文件内容保存在内存里,而不是像 PHP 那样保存在临时文件里。这样对于大文件,问题很明显了——内容不够。所以,Tornado 上传文件的大小限制在 100M 以下了。Tornado 官方建议使用 nginx 的上传模块来处理文件上传。
普通上传
import tornado.ioloop
import tornado.web
UPLOAD_FILE_PATH = '/path/to/files/'
class MainHandler(tornado.web.RequestHandler):
def get(self):
args = dict(username = 'visitor')
self.render('home.html', **args)
class UploadHandler(tornado.web.RequestHandler):
# 第一种写法
def post(self):
username = self.get_argument('username', 'anonymous')
if self.request.files.get('uploadfile', None):
uploadFile = self.request.files['uploadfile'][0]
filename = uploadFile['filename']
fileObj = open(UPLOAD_FILE_PATH+username+filename, 'wb')
fileObj.write(uploadFile['body'])
self.write("上传成功")
# 第二种写法
def post(self):
ret = {'result': 'OK'}
upload_path = os.path.join(os.path.dirname(__file__), 'files') # 文件的暂存路径
file_metas = self.request.files.get('file', None) # 提取表单中‘name’为‘file’的文件元数据
if not file_metas:
ret['result'] = 'Invalid Args'
return ret
for meta in file_metas:
filename = meta['filename']
file_path = os.path.join(upload_path, filename)
with open(file_path, 'wb') as up:
up.write(meta['body'])
# OR do other thing
self.write(json.dumps(ret))
application=tornado.web.Application([(r'/',MainHandler),('/upload', UploadHandler) ],
template_path = 'templates',
debug = True
)
if __name__=='__main__':
application.listen(8888)
tornado.ioloop.IOLoop.instance().start()