在大的项目开发中,对于文件的上传和下载是必不可少的,就比如说用户头像吧,本章节介绍Tornado通过获取表单数据,保存文件和参数,简单的说就是实现文件上传功能。同时通过复杂表单的方式提交,不仅能够上传文件,还能够发送数据,在python中配合seek命令,可以实现更复杂的下载请求,比如,断点续传、分块下载。解决中文名下载报错问题

一、上代码

import tornado.ioloop
import tornado.web#上传文件 的路由
class UploadHandler(tornado.web.RequestHandler):# 设置允许跨域def set_default_headers(self):self.set_header("Access-Control-Allow-Origin", "*")self.set_header("Access-Control-Allow-Headers", "Content-Type")self.set_header("Access-Control-Allow-Methods", "POST,GET,OPTIONS")def post(self,*args,**kwargs):try:# 表单上传 数据形式是multipart/form-data,既可以提交普通键值对,也可以提交(多个)文件键值对# 表单上传,这个image其实就是我们上传文件的键值对中的键,而其中这个值呢就是文件,在发送端也可以说是文件路径file_imgs = self.request.files.get('image',None) # 返回的是一个文件列表devicemodel = self.get_body_argument('devicemodel') # 我们在发送文件的时候可能会发送其他参数if not file_imgs:# 判断文件是否为空self.write({"error":"file none!"})returnfor file_img in file_imgs: #可能同一个上传的文件会有多个文件,所以要用for循环去迭代它# filename 文件的实际名字,body 文件的数据实体;content_type 文件的类型。 这三个对象属性可以像字典一样支持关键字索引# 我们定义保存的路径,同样的你自己可以指定,也可以通过参数获取,但是如果当前目录不存在 你需要处理,否则报错save_to = './{}'.format(file_img['filename'])# 同名称的文件且同类型文件会覆盖,切记记得区分或者特殊处理比如加上时间戳# 以二进制格式打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。一般用于非文本文件如图片等。with open(save_to,'wb') as f: #二进制f.write(file_img['body'])self.write({"success":"upload success!"})except Exception as e:print("upload",e)self.write({"error":"server error!"})
def main():# 定义请求的路径和响应的请求类,此类会根据你发出的请求区分get 还是post而给予不同的处理application = tornado.web.Application([(r"/upload", UploadHandler),])# 绑定端口,单进程启动application.listen(8000)tornado.ioloop.IOLoop.instance().start()if __name__ == "__main__":main()

二、测试

上传成功,我们来看一下postman给的代码

表单提交

三、至于文件下载,其实在上传的时候我们就可以将文件的存放路径给保存下来,写入数据库,留着我们下载使用,但是下载大文件一般推荐使用ftp协议,小的文件就可以用这个http协议,同样是二进制读取文件。

1、上代码

import tornado.ioloop
import tornado.web
# 引入url编码,解决中文文件名下载报错问题
from urllib import parseclass DownloadHandler(tornado.web.RequestHandler):# 设置允许跨域def set_default_headers(self):self.set_header("Access-Control-Allow-Origin", "*")self.set_header("Access-Control-Allow-Headers", "Content-Type")self.set_header("Access-Control-Allow-Methods", "POST,GET,OPTIONS")def get(self):# 获取参数# 读取的内存大小,一般会在保存文件的时候记录下来,最好比源文件大buf_size = 4096filename=self.get_argument('filename', None)if not filename:self.write({"error":"文件名称为空"})return# 设置传输的文件类型,有很多例如png/pdf等等 取决于不同场景,这边我用octet-streamself.set_header ('Content-Type', 'application/octet-stream')path='./'+filenamewith open( path, 'rb') as f:while True:data = f.read(buf_size)if not data:breakself.write(data)filename=parse.quote(filename)# 设置文件保存名,也就是你下载完成显示的名称,我们对文件名进行url编码,因为header对中文是不支持的# 在浏览器下载的时候,会进行解码的self.set_header ('Content-Disposition', 'attachment; filename='+filename)self.finish()def main():# 定义请求的路径和响应的请求类,此类会根据你发出的请求区分get 还是post而给予不同的处理application = tornado.web.Application([(r"/download", DownloadHandler),])# 绑定端口,单进程启动application.listen(8000)tornado.ioloop.IOLoop.instance().start()if __name__ == "__main__":main()

2、测试,运行dw.py

我在浏览器中输入localhost:8000/download?filename=中文.txt,回车就可以下载了

搭建Tornado Https服务器之上传和下载文件(12)相关推荐

  1. windows主机用scp命令向Linux服务器上传和下载文件

    windows主机用scp命令向Linux服务器上传和下载文件 文章目录: 一.scp介绍 二.scp上传和下载 1.上传 2.下载 三.scp的更多参数 一.scp介绍 scp是secure cop ...

  2. Java从sftp服务器上传与下载文件

    一.背景 业务需要从sftp服务器上上传.下载.删除文件等功能,通过查阅资料及手动敲打代码,实现了操作sftp的基本功能,有需求的小伙伴可以看看具体的实现过程. 二.sftp介绍 摘自百度百科:SSH ...

  3. 从服务器上传和下载文件方法

    1. ssh 安装SSH Secure Shell Client客户端 下载链接 http://download.csdn.net/detail/jiandanjinxin/9755684 使用方法参 ...

  4. MacOS利用终端与Linux服务器上传与下载文件

    mac用terminnal.app 上传与下载文件及文件夹到Linux上 方式一: 终端--新建远程连接--安全Shell--右下方 + 输入IP和用户名 如果提示:Permission denied ...

  5. 用mac终端给Linux服务器上传、下载文件

    一. (1)打开终端,在shell菜单下找到:"新建远程连接". (2)在"新建远程连接"下,找到"安全文件传输(sftp)". (3)新建 ...

  6. MacBook 往服务器上传、下载文件的几种操作

    文章目录 说明 1 FinalShell 2 Termius 说明 往服务器传文件.下载文件有很多种方法,可以使用scp.rsync或者rs/sz MacBook上的rz和sz 配置起来比较麻烦 这里 ...

  7. 记录 之 跨服务器上传和下载文件

    例 A.192.168.161.75,B.132.49.34.73. 1.下载:在A服务器上操作,将B远程服务器上/home/lk/目录下所有的文件全部复制到本地的/root目录下,命令为: scp ...

  8. 电脑向linux服务器传输文件,windows如何通过ssh工具向linux服务器上传和下载文件?...

    这个是很简单的.我用win10和kali给你举例子.kali自带了ssh,只不过我们需要开启它.kali下运行ps -e | grep ssh,你会发现已经有了ssh.只是没有启动,启动方法是/etc ...

  9. 用废旧手机搭建一个Linux服务器,附有免费下载文件

    因为手机 CPU.内存.储存都合适,还有丰富的接口:蓝牙.WIFI.Mirco B,而且手机的异构多核心架构,更加省电,比树莓派强不少呢.下面进入正题,不写代码就可以打造自己的服务器.(踩了很多坑,这 ...

最新文章

  1. 无法解析 list 中的方法 iterator_Python-list中的append()和extend()方法区别
  2. mysql update 加减乘除运算
  3. DirectInput:poll轮询理解
  4. springboot 获取配置文件中的值_Spring Boot面试必问(亲测)
  5. matlab平面绘图命令
  6. C++迭代器的使用和操作总结
  7. 如何通过预加载器提升网页加载速度
  8. 数据结构之排序五:选择排序
  9. OnLongClickListener长按事件设置墙纸
  10. 2017.3.31 洞穴勘测 思考记录
  11. 【Pre蓝桥杯嵌入式】【STM32】学习索引
  12. mysql的两种存储方法_mysql的两种存储引擎
  13. Eclipse智能感知功能优化
  14. zabbix邮件报警功能的验证
  15. JavaScript中清空数组的三种方式
  16. 现代语音信号处理之倒谱分析与同态滤波
  17. 如何开发类似QFIL下载工具
  18. 批改网复制粘贴_如何使用批改网组织线上考试
  19. 苹果新系统很鸿蒙!iPad终于能写代码了,iPhone竟成异地恋神器 | WWDC 2021
  20. 数字图像处理:图像压缩1 基础无损压缩

热门文章

  1. 又想起《光阴的故事》
  2. 全球清廉指数排名中国上升三位
  3. 软件测试学着难吗,软件测试难学吗?学不会怎么办?
  4. 如何做一个完美的项目经理
  5. 阿里钉钉架构师,20页ppt讲透2亿用户的钉钉系统架构实践
  6. Linux定时重启tomcate
  7. ubuntu15.04 32位下基于IRSTLM,GIZA++和Moses的统计翻译系统的环境搭建及运行
  8. input禁止输入html转义字符串,在HTML中取消转义CSS输入
  9. python怎样操作excel表_python操作excel表
  10. 2019CCPC秦皇岛赛区 hdu 6740 MUV LUV EXTRA(KMP next数组)