flask后端接口:
本来是和FTP结合的下载工具 ,FTP下载文件到服务器本地,然后再结合前端文件流下载。
本地直接启动,文件路径换成自己的:
访问路径+文件路径
http://localhost:8000/download?filepath=D:/goole_download/textUInt8Array.txt’
或者 http://localhost:8000/download/filepath=Users/apple/PycharmProjects/ftp/static/myfile/hhh.txt
需要修改自己的文件名
第一种 前端输入框输入文件路径模式下载
xxx.py文件
import flask
import os
import sys
import json
from flask import request
from flask import Response
interface_path = os.path.dirname(__file__)
sys.path.insert(0, interface_path) # 将当前文件的父目录加入临时系统变量
app = flask.Flask(__name__)
def file_iterator(file_path, chunk_size=512):
"""
文件读取迭代器
:param file_path:文件路径
:param chunk_size: 每次读取流大小
:return:
"""
with open(file_path, 'rb') as target_file:
while True:
chunk = target_file.read(chunk_size)
if chunk:
yield chunk
else:
break
# 下载
@app.route('/download', methods=['GET'])
def download():
"""
文件下载
:return:
"""
file_path = request.values.get('filepath')
if file_path is None:
return json.dumps({'success': 0, 'message': '请输入参数'},ensure_ascii=False)
else:
if file_path == '':
return json.dumps({'success': 0, 'message': '请输入正确路径'},ensure_ascii=False)
else:
if not os.path.isfile(file_path):
return json.dumps({'success': 0, 'message': '文件路径不存在'},ensure_ascii=False)
else:
filename = os.path.basename(file_path)
response = Response(file_iterator(file_path))
response.headers['Content-Type'] = 'application/octet-stream'
response.headers["Content-Disposition"] = 'attachment;filename="{}"'.format(filename)
return response
if __name__ == '__main__':
app.run(host='0.0.0.0', port=8000)
前端页面:
xxx.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="http://code.jquery.com/jquery-1.10.2.js"></script>
</head>
<body>
<form action="http://localhost:8000/download" method="get">
<input type="text" name="filepath"/>
<input type="submit" value="提交">
</form>
</body>
<script type="text/javascript">
var $eleBtn2 = $("#btn");
//已知一个下载文件的后端接口 https://codeload.github.com/douban/douban-client/legacy.zip/master
//方法一:window.open()
$eleBtn1.click(function(){
//后端的文件路径
var url = 'http://localhost:8000/download?filepath=D:/goole_download/textUInt8Array.txt'
window.open(url);
});
</script>
</html>
第二种 前端a标签点击下载 后端
xxx.py
import flask
import os
import sys
import json
from flask import request
from flask import Response
interface_path = os.path.dirname(__file__)
sys.path.insert(0, interface_path) # 将当前文件的父目录加入临时系统变量
app = flask.Flask(__name__)
def file_iterator(file_path, chunk_size=512):
"""
文件读取迭代器
:param file_path:文件路径
:param chunk_size: 每次读取流大小
:return:
"""
with open(file_path, 'rb') as target_file:
while True:
chunk = target_file.read(chunk_size)
if chunk:
yield chunk
else:
break
# 下载
@app.route('/download', methods=['GET'])
def download():
"""
文件下载
:return:
"""
if request.method=="GET":
file_path = request.values.get('filepath')
if not os.path.isfile(file_path):
return json.dumps({'success': 0, 'message': '文件路径不存在'},ensure_ascii=False)
else:
filename = os.path.basename(file_path)
response = Response(file_iterator(file_path))
response.headers['Content-Type'] = 'application/octet-stream'
response.headers["Content-Disposition"] = 'attachment;filename="{}"'.format(filename)
return response
if __name__ == '__main__':
app.run(host='0.0.0.0', port=8000)
前端 xxx.html:
//最好用模版渲染 然后就可以不指定文件下载
<a name="downloadbtn" class="btn btn-success pull-right" href="/downloadfile/?filename=/root/allfile/{{file}}"download="{{file}}" >下载</a>
<a name="downloadbtn" class="btn btn-success pull-right" href="/downloadfile/?filename=/root/allfile/123.txt">下载</a>
如果是win电脑。文件路径一点要反义
win路径:
D:\PycharmProjects\ftp\static\myfile\hhh.txt
反义后的路径:
D%3A%5CPycharmProjects%5Cftp%5Cstatic%5Cmyfile%5Chhh.txt
<a name="downloadbtn" class="btn btn-success pull-right" href="/downloadfile/?filename=D%3A%5CPycharmProjects%5Cftp%5Cstatic%5Cmyfile%5Chhh.txt" download="hhh.txt">下载文件</a>