一.上传文件
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中数据