tornado 文件上传

主体部分

class uploadReport(BaseHandler):
    def options(self):
        pass
    @gen.coroutine
    def post(self):
        try:
            auth_header = self.request.headers.get('Authorization', None)
            if auth_header is not None:
                userID = base_token_valid(auth_header)
                if userID:
                    #result = self.request.body.decode('utf-8')
                    projectID = self.get_body_arguments("projectID")[0]
                    reportType = self.get_body_arguments("reportType")[0]
                    file_metas = self.request.files.get('file', None)  # 提取表单中‘name'为‘file'的文件元数据
                    result = yield model.uploadReport(file_metas,projectID,reportType,userID)
                    # print(result)

                    self.write(json.dumps(result, cls=JsonToDatetime, ensure_ascii=False))
                else:
                    self.write('authentication fail')
            else:
                self.write('authentication fail')

        except Exception as e:
            self.write(json.dumps({"data":"authentication fail","message":"{}".format(e)}, ensure_ascii=False))

方法实现部分


@gen.coroutine
def uploadReport(file_metas,projectID,reportType,userID):
    try:
        ret = {'result': 'OK'}
        
        upload_path = os.path.join(os.path.dirname(__file__), 'files/{}/{}'.format(projectID,reportType))  # 文件的暂存路径,按项目,类型层级

        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)

            if not os.path.exists(os.path.split(file_path)[0]):
                # 目录不存在创建,makedirs可以创建多级目录
                os.makedirs(os.path.split(file_path)[0])

            with open(file_path, 'wb') as up:
                up.write(meta['body'])

    except Exception as e:
        ret = {'result': str(e)}
    raise gen.Return(ret)

客户端请求访问

image.png

你可能感兴趣的:(tornado 文件上传)