flask 实现文件上传 下载

一、创建 flask 实现上传、与下载功能

from flask import Flask, render_template, request, session, send_file, make_response, redirect
from werkzeug.utils import secure_filename
import os

# api接口
app = Flask(__name__)

UPLOAD_PATH = 'out_data/input'
os.makedirs(UPLOAD_PATH,exist_ok=True)

def allowed_file(filename):
    return "." in filename and filename.rsplit('.', 1)[1].lower() in set(['txt','mp3'])

@app.route('/upload/', methods=['GET', 'POST'])
def upload():
    if request.method == 'GET':
        return render_template('upload.html')
    else:
        file = request.files.get('pic')  # 获取文件

        # 上传空文件(无文件)
        if file.filename == '':
            return redirect(request.url)

        # 只能上传 allowed_file() 限制的文件
        if file and allowed_file(file.filename):
            filename = secure_filename(file.filename)  # 用这个函数确定文件名称是否是安全 (注意:中文不能识别)
            outpath = os.path.join(UPLOAD_PATH, filename)
            file.save(outpath)  # 保存文件

            # 返回该保存好的文件,as_attachment=True 自动弹出下载
            return send_file(outpath, as_attachment=True)

        else:
            return redirect(request.url)

if __name__ == '__main__':
    app.run( debug=True)

HTML 界面,保存 templates/upload.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <form action="/upload/" method="post" enctype="multipart/form-data">
        上传文件:<input type="file" name="pic"><br>
        <input type="submit" value="提交">
    </form>
</body>
</html>

二、代码调用

import requests

# 设置上传文件的URL  
url = 'http://0.0.0.0:8888/upload/'

# 设置要上传的文件路径  
file_path = r".\*.*"
# 设置下载文件的文件路径
out_file_path = r".\*.*"


with open(file_path, 'rb') as file:
    files = {'pic': file}
    response = requests.post(url, files=files)

if response.status_code == 200:
    print("文件上传成功 等待处理...")
    
    # 下载返回文件
    with open(out_file_path, 'wb') as f:
        f.write(response.content)
    
    print('输出成功')
else:
    print(f"文件上传失败,状态码:{response.status_code}")
    # 可以处理错误情况,例如打印错误信息  
    print(response.text)

网页调用

输入网址 http://0.0.0.0:8888/upload/ ,选择文件+提交,成功上传,自动弹出下载页面

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值