Falsk 大文件上传/下载(send_from_directory)
下载接口:
服务端flask下载接口
@app.route("/api/download/", methods=["POST"])
def download():
try:
logger.debug("download start")
param = request.get_json(force=True).get('param')
logger.debug("download({})".format(param))
file_path = param.get('file_path')
file_name = param.get('file_name')
base_dir = u"C:\\Program Files\\download"
file_dir = os.path.join(base_dir, file_path)
file_abs_path = os.path.join(file_dir, file_name)
logger.debug("send_from_directory file_dir ({}) ,file_name({})".format(file_dir, file_name))
response_file = send_from_directory(file_dir, filename=file_name, as_attachment=False)
response = make_response(response_file)
response.headers["Content-Disposition"] = "attachment; filename={}".format(file_name.encode().decode("latin-1"))
response.headers["Content-Length"] = os.stat(file_abs_path).st_size
response.headers["Content-Type"] = "application/octet-stream"
return response
except:
logger.debug("download failed ({})".format(traceback.format_exc()))
response = {"status": 9999}
return jsonify(response)
客户端下载接口
url = "https://{}:{}/api/download/".format(server_ip, get_https_port())
data = {"param": {
"file_path": file_path,
"file_name": file_name
}}
save_to = "/home"
try:
logger.debug("download, url[%s] data:%s" % (url, data))
download_headers = {"Content-Type": "application/json"}
res = requests.post(url=url, headers=download_headers, data=json.dumps(data), verify=False)
logger.debug('download response status[%s] headers:%s' % (res.status_code, res.headers))
if not os.path.exists(save_to):
os.makedirs(save_to)
save_path = os.path.join(save_to, file_name)
with open(save_path, "wb") as fp:
for chunk in res.iter_content(1024):
if not chunk:
break
fp.write(chunk)
上传接口:
服务接口上传文件接口
@app.route("/api/upload/", methods=["POST"])
def upload():
if request.method == "POST":
try:
logger.debug("upload vars ({})".format(request.files))
file = request.files['file']
content = file.read()
# bdecode(content)
path = "/home"
file_path = os.path.join(path, file_name)
if os.path.exists(file_path):
os.remove(file_path)
with open(file_path, "wb") as f:
f.write(content)
f.flush()
f.close()
return jsonify({"status": 0, "data": []})
except:
logger.debug("save upload file fail ({})".format(traceback.format_exc()))
return jsonify({"status": 1, "data": []})
客户端上传接口:
url = "https://{}:{}/api/download/".format("192.168.11.200", "8000")
file_path = "/home/dddd/aaa.txt"
file_name = os.path.split(file_path)[-1]
send_data = {}
headers = {
'Connection': 'keep-alive',
'User-Agent': 'P2pclient with Linuxos',
'Accept-Language': 'en-US,en;q=0.5',
'Accept-Encoding': 'gzip, deflate',
}
if not send_data:
with open(file_path, 'rb')as fp:
file_list = {'file': (file_name, fp, ''), "uuid": timestamp_uuid, "sign": sign,
"Authorization": "token"}
response = requests.post(url, headers=headers, timeout=15,
files=file_list, verify=False)
else:
with open(file_path, 'rb')as fp:
file_list = {'file': (file_name, fp, ''), "uuid": timestamp_uuid, "sign": sign,
"Authorization": "token"}
response = requests.post(url, headers=headers, timeout=15,
data=send_data, files=file_list, verify=False)
logger.debug('upload {} to {} response {}'.format(file_path, url, response.__dict__))
data = response.json()
if data.get('status') == 0:
logger.debug('upload {} to {} successed!'.format(file_path, url))
return True
else:
logger.debug('upload {} to {} failed, try again ... {}'.format(file_path, url, i))
return False
Falsk 大文件上传/下载(send_from_directory)的更多相关文章
- Java实现FTP批量大文件上传下载篇1
本文介绍了在Java中,如何使用Java现有的可用的库来编写FTP客户端代码,并开发成Applet控件,做成基于Web的批量.大文件的上传下载控件.文章在比较了一系列FTP客户库的基础上,就其中一个比 ...
- java+大文件上传下载
文件上传下载,与传统的方式不同,这里能够上传和下载10G以上的文件.而且支持断点续传. 通常情况下,我们在网站上面下载的时候都是单个文件下载,但是在实际的业务场景中,我们经常会遇到客户需要批量下载的场 ...
- java+web+大文件上传下载
文件上传是最古老的互联网操作之一,20多年来几乎没有怎么变化,还是操作麻烦.缺乏交互.用户体验差. 一.前端代码 英国程序员Remy Sharp总结了这些新的接口 ,本文在他的基础之上,讨论在前端采用 ...
- java 如何实现大文件上传下载(传输)各种格式
我们平时经常做的是上传文件,上传文件夹与上传文件类似,但也有一些不同之处,这次做了上传文件夹就记录下以备后用. 首先我们需要了解的是上传文件三要素: 1.表单提交方式:post (get方式提交有大小 ...
- HTML上传文件支持大文件上传,下载
上传 1.修改配置文件web.config,在<system.webServer>下面加入 <security> <requestFiltering > <r ...
- java+大文件上传+下载
我们平时经常做的是上传文件,上传文件夹与上传文件类似,但也有一些不同之处,这次做了上传文件夹就记录下以备后用. 这次项目的需求: 支持大文件的上传和续传,要求续传支持所有浏览器,包括ie6,ie7,i ...
- html大文件上传下载
一.概述 所谓断点续传,其实只是指下载,也就是要从文件已经下载的地方开始继续下载.在以前版本的HTTP协议是不支持断点的,HTTP/1.1开始就支持了.一般断点下载时才用到Range和Content- ...
- 全网最简单的大文件上传与下载代码实现(React+Go)
前言 前段时间我需要实现大文件上传的需求,在网上查找了很多资料,并且也发现已经有很多优秀的博客讲了大文件上传下载这个功能. 我的项目是个比较简单的项目,并没有采用特别复杂的实现方式,所以我这篇文章的目 ...
- Nginx集群之WCF大文件上传及下载(支持6G传输)
目录 1 大概思路... 1 2 Nginx集群之WCF大文件上传及下载... 1 3 BasicHttpBinding相关配置解析... 2 4 编写 ...
- PHP实现大文件上传和下载
一提到大文件上传,首先想到的是啥??? 没错,就是修改php.ini文件里的上传限制,那就是upload_max_filesize.修改成合适参数我们就可以进行愉快的上传文件了.当然啦,这是一般情况下 ...
随机推荐
- <string> <cstring> <string.h>
<string>是C++标准库头文件,包含了拟容器class std::string的声明(不过class string事实上只是basic_string<char>的type ...
- git submodule .gitmodules 子模块
初始化 git submodule init 添加子项目 git submodule add -b xxxx {path} -b 指定分支 path 可为空 (不知为何, 直接写在 .gitmodul ...
- Oracle虚拟机与主机共享设置
VM中linux与主机的文件共享 1.打开 Oracle VM VirtualBox 点击 [控制] [设置] [数据空间] 添加你所希望共享的文件夹
- Linux 文件编码操作enca[适用Mac]
查看文件编码: enca file.csv 修改文件编码 enca -x UTF-8 file.csv
- leedcode题目 :罗马数字转整数 Java
罗马数字包含以下七种字符: I, V, X, L,C,D 和 M. 例如, 罗马数字 2 写做 II ,即为两个并列的 1.12 写做 XII ,即为 X + II . 27 写做 XXVII, 即 ...
- vue-图书管理系统
/* 路由模块 */ const express = require('express'); const router = express.Router(); const service = requ ...
- Hyperledger fabric 续篇
前面我们如果进行顺利的话,环境已经可以成功运行,并且前端页面也可以正常显示,为自己鼓掌吧!!! 接下来,其实也是我自己想做一下尝试,还记得前面的一条查询车辆情况的指令吗? peer chaincode ...
- C#封装以及访问修饰符
封装 被定义为"把一个或多个项目封闭在一个物理的或者逻辑的包中".在面向对象程序设计方法论中,封装是为了防止对实现细节的访问. 抽象和封装是面向对象程序设计的相关特性.抽象允许相关 ...
- 光纤加速计算 383-高速信号处理板 XCKU060的双路QSFP+光纤PCIe 卡 XCKU060板卡
基于kintex UltraScale XCKU060的双路QSFP+光纤PCIe 卡 一.板卡概述 本板卡系北京太速科技自主研发,基于Xilinx UltraScale Kintex系列FPGA ...
- vue中,解决chrome下,的warning, Added non-passive event listener to a scroll-blocking ‘mousewheel‘ event 问题
写项目的时候,Chrome 提醒: [Violation] Added non-passive event listener to a scroll-blocking 'mousewheel' eve ...