使用tornado编程,有上传文件需求时一般有两种方案,一种是tornado自带的方法,一种是借助反向代理,比如nginx的上传模块.在业务需求简单的时候,用tornado自带的方法不失为一种高效的选择.

下面的代码实现了简单的文件上传,将上传的文件保存在配置文件规定的静态文件存放目录的子目录img下.

html代码

<form class="form-post" action="/">
    {% raw xsrf_form_html() %}
    <input type="text" name="Key">
    <input type="file" name="logo">
    <button type="submit">提交</button>
</form>

javascript代码

$(document).delegate('.form-post','submit',  function() {
    var form = $(this);
    var formData = new FormData(this)
    $.ajax({
        type : 'POST',
        url : form.attr('action'),
        data : formData,
        dataType : 'json',
        cache : false,
        contentType: false,
        processData: false,
        success : function(result) {
            //成功后执行的代码
        }
    });
    return false
});

python代码

import os
import uuid
//略去控制器声明等,只显示关键代码
path = os.path.join(super(ThisHandler, self).settings['static_path'],'img')
abspath = os.path.abspath(path)
logo = self.request.files['logo'][0]
filename = logo['filename']
'''
filename = filename.split('.').pop(0)+'_'+str(uuid.uuid4())+'.'+filename.split('.').pop()
将文件名进行唯一重命名处理,防止覆盖
'''
filebody = logo['body']
savename = os.path.join(abspath,filename)
with open(savename,'wb') as f:
    f.write(filebody)