Python 前后端文件流下载文件接口代码

3 篇文章 0 订阅
1 篇文章 0 订阅

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>

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值