tornado 7、文件上传下载,验证码直接渲染到浏览器

tornado 7、文件上传下载,验证码直接渲染到浏览器

一.上传文件

class MemberEditHandler(BaseHandler):
    @tornado.web.authenticated
    def get(self,num):
        self.write(json.dumps({"status":1}))
    @tornado.web.authenticated
    def post(self,non):
        upload_path = os.path.join(os.getcwd(),'template\\html\\member\\')
        if "fileToUpload0" in self.request.files:     #tornado的上传文件保存在self.request.files
            f = self.request.files['fileToUpload0'][0]   #注意self.request.files['fileToUpload0']是一个数组
            fName = f['filename']
            fin = open(upload_path + uid + "img" + fName,"wb")   #打开文件流,以二进制写入方式打开。必须以b二进制,不然文件出错  
            fin.write(f["body"])                                #把f["body"]中内容写进去
            fin.close()                                         #关闭文件流
            data["img"] = uid + "img" + fName
        BM.update("member",{"uid":uid},data)
        self.write(json.dumps({"status":1}))
  •  

第二种方式,我在使用上传图片时可以,其他文件出错,不知原因。

class HomeHandler(BaseHandler):
    @tornado.web.authenticated
    def get(self):
        self.render("admin/home.html",nav=1)
    @tornado.web.authenticated
    def post(self):
        upload_path = os.path.join(os.getcwd(),'template\\file\\home')
        filesuffix = '.png'
        filename = "PatternRecognitionAndAnalysis"+filesuffix
        if 'fileToUpload' in self.request.files.keys():     #判断'fileToUpload'是否在self.request.files中
            file_metas = self.request.files['fileToUpload']
            for meta in file_metas:
                filepath = os.path.join(upload_path,filename)
                with open (filepath,'wb') as up:
                    up.write(meta['body'])
        BM.update("home",{"img":filename})
        self.write(json.dumps({"status":1}))
  •  

二.下载文件

1、如果我们把文件保存在静态文件夹中,我们可以直接返回静态路径:

self.write(json.dumps({"url":"/static/file/other/"+ url}))
  •  

2、动态下载,在需要的时候才下载, 主要用来控制下载权限:

class DownHandler(tornado.web.RequestHandler): 
  def get(self,fileName):
    with open("download\\" + fileName, "rb") as f:
      self.set_header('Content-Type','application/octet-stream')
      self.write(f.read())
  •  

三.验证码图片

验证码图片一般只使用一次,如果保存为图片的话还有考虑增删问题,比较麻烦,如果我们将其保存到字符流在渲染给浏览器就会避免这种问题。

import StringIO
class IdentifyCodeHandler(BaseHandler):
    def get(self): 
        #保存于字符流,打印给浏览器  
        out=StringIO.StringIO()   #先打开StringIO
        codeimg.save(out, "PNG")        #通过图片保存到out字符流中去
        self.set_header('Content-Type','image/jpg')         #必需要设置头部为image,不然浏览器不知道是图片
        self.write(out.getvalue())      #读取StringIO中数据
  •  

文章标签: tornado

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值