搭建Tornado Https服务器之上传和下载文件(12)
在大的项目开发中,对于文件的上传和下载是必不可少的,就比如说用户头像吧,本章节介绍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)相关推荐
- windows主机用scp命令向Linux服务器上传和下载文件
windows主机用scp命令向Linux服务器上传和下载文件 文章目录: 一.scp介绍 二.scp上传和下载 1.上传 2.下载 三.scp的更多参数 一.scp介绍 scp是secure cop ...
- Java从sftp服务器上传与下载文件
一.背景 业务需要从sftp服务器上上传.下载.删除文件等功能,通过查阅资料及手动敲打代码,实现了操作sftp的基本功能,有需求的小伙伴可以看看具体的实现过程. 二.sftp介绍 摘自百度百科:SSH ...
- 从服务器上传和下载文件方法
1. ssh 安装SSH Secure Shell Client客户端 下载链接 http://download.csdn.net/detail/jiandanjinxin/9755684 使用方法参 ...
- MacOS利用终端与Linux服务器上传与下载文件
mac用terminnal.app 上传与下载文件及文件夹到Linux上 方式一: 终端--新建远程连接--安全Shell--右下方 + 输入IP和用户名 如果提示:Permission denied ...
- 用mac终端给Linux服务器上传、下载文件
一. (1)打开终端,在shell菜单下找到:"新建远程连接". (2)在"新建远程连接"下,找到"安全文件传输(sftp)". (3)新建 ...
- MacBook 往服务器上传、下载文件的几种操作
文章目录 说明 1 FinalShell 2 Termius 说明 往服务器传文件.下载文件有很多种方法,可以使用scp.rsync或者rs/sz MacBook上的rz和sz 配置起来比较麻烦 这里 ...
- 记录 之 跨服务器上传和下载文件
例 A.192.168.161.75,B.132.49.34.73. 1.下载:在A服务器上操作,将B远程服务器上/home/lk/目录下所有的文件全部复制到本地的/root目录下,命令为: scp ...
- 电脑向linux服务器传输文件,windows如何通过ssh工具向linux服务器上传和下载文件?...
这个是很简单的.我用win10和kali给你举例子.kali自带了ssh,只不过我们需要开启它.kali下运行ps -e | grep ssh,你会发现已经有了ssh.只是没有启动,启动方法是/etc ...
- 用废旧手机搭建一个Linux服务器,附有免费下载文件
因为手机 CPU.内存.储存都合适,还有丰富的接口:蓝牙.WIFI.Mirco B,而且手机的异构多核心架构,更加省电,比树莓派强不少呢.下面进入正题,不写代码就可以打造自己的服务器.(踩了很多坑,这 ...
最新文章
- 无法解析 list 中的方法 iterator_Python-list中的append()和extend()方法区别
- mysql update 加减乘除运算
- DirectInput:poll轮询理解
- springboot 获取配置文件中的值_Spring Boot面试必问(亲测)
- matlab平面绘图命令
- C++迭代器的使用和操作总结
- 如何通过预加载器提升网页加载速度
- 数据结构之排序五:选择排序
- OnLongClickListener长按事件设置墙纸
- 2017.3.31 洞穴勘测 思考记录
- 【Pre蓝桥杯嵌入式】【STM32】学习索引
- mysql的两种存储方法_mysql的两种存储引擎
- Eclipse智能感知功能优化
- zabbix邮件报警功能的验证
- JavaScript中清空数组的三种方式
- 现代语音信号处理之倒谱分析与同态滤波
- 如何开发类似QFIL下载工具
- 批改网复制粘贴_如何使用批改网组织线上考试
- 苹果新系统很鸿蒙!iPad终于能写代码了,iPhone竟成异地恋神器 | WWDC 2021
- 数字图像处理:图像压缩1 基础无损压缩
热门文章
- 又想起《光阴的故事》
- 全球清廉指数排名中国上升三位
- 软件测试学着难吗,软件测试难学吗?学不会怎么办?
- 如何做一个完美的项目经理
- 阿里钉钉架构师,20页ppt讲透2亿用户的钉钉系统架构实践
- Linux定时重启tomcate
- ubuntu15.04 32位下基于IRSTLM,GIZA++和Moses的统计翻译系统的环境搭建及运行
- input禁止输入html转义字符串,在HTML中取消转义CSS输入
- python怎样操作excel表_python操作excel表
- 2019CCPC秦皇岛赛区 hdu 6740 MUV LUV EXTRA(KMP next数组)