美文网首页
Flask框架实现文件服务器(支持上传和下载)

Flask框架实现文件服务器(支持上传和下载)

作者: 逐风细雨 | 来源:发表于2019-12-12 16:54 被阅读0次

最近测试的时候需要模拟一个文件服务器,支持文件的上传和下载功能。百度了一下各位大神的博客,结合公司的实际情况,写了一个文件服务器。
环境信息:python3.7.4 + Flask(1.1.1)
测试工具:requests(2.22.0)
目录结构:


image.png

代码如下:

import os
from string import Template
from flask import Flask, request, send_file
from werkzeug.utils import secure_filename


app = Flask(__name__)
pwd = os.path.dirname(__file__)

#定义文件的保存路径和文件名尾缀
UPLOAD_FOLDER = os.path.join(pwd,'save_file')
ALLOWED_EXTENSIONS = {'txt', 'pdf', 'png', 'jpg', 'jpeg', 'gif'}
app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER

HOST = "192.168.52.235"
PORT = 5000


@app.route('/index')
def index():
    """
    返回一个网页端提交的页面
    :return:
    """
    html = Template("""
    <!DOCTYPE html>
    <html>
       <body>
    
          <form action = "http://$HOST:$PORT/upload" method = "POST"
             enctype = "multipart/form-data">
             <input type = "file" name = "file" />
             <input type = "submit"/>
          </form>
    
       </body>
    </html>
    """)
    html = html.substitute({"HOST": HOST, "PORT": PORT})
    return html

def allowed_file(filename):
    """
    检验文件名尾缀是否满足格式要求
    :param filename:
    :return:
    """
    return '.' in filename and \
           filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS

@app.route('/upload', methods=['GET', 'POST'])
def upload_file():
    """
    上传文件到save_file文件夹
    以requests上传举例
    wiht open('路径','rb') as file_obj:
        rsp = requests.post('http://localhost:5000/upload,files={'file':file_obj})
        print(rsp.text) --> file uploaded successfully
    """
    if 'file' not in request.files:
        return "No file part"
    file = request.files['file']
    if file.filename == '':
        return 'No selected file'
    if file and allowed_file(file.filename):
        filename = secure_filename(file.filename)
        file.save(os.path.join(app.config['UPLOAD_FOLDER'], filename))
        return 'file uploaded successfully'
    return "file uploaded Fail"


@app.route("/download")
def download_file():
    """
    下载src_file目录下面的文件
    eg:下载当前目录下面的123.tar 文件,eg:http://localhost:5000/download?fileId=123.tar
    :return:
    """
    file_name = request.args.get('fileId')
    file_path = os.path.join(pwd,'src_file',file_name)
    if os.path.isfile(file_path):
        return send_file(file_path,as_attachment=True)
    else:
        return "The downloaded file does not exist"

if __name__ == '__main__':
    app.run(host=HOST, port=PORT)

通过浏览器上传:
1.打开web上传页


image.png

2.选择上传文件


image.png
3.点击提交,查看结果:
image.png
ps:如果save_file有同名的文件会直接覆盖,如果需做备份和报错处理,可自行研究(常用的文件操作)

通过requests上传,代码如下:

#文件服务器的测试脚本
import requests

URL="http://192.168.52.235:5000/upload"

f = open(r'D:\work\tools\file_server\templates\upload.html','rb')

rsp = requests.get(URL,files={'file':f})
print(rsp.text)

下载src_file下面的文件的url,get或者post都支持,浏览器直接打开,或者接口调用工具打开;
url:http://localhost:5000/download?fileId=tool.py

相关文章

网友评论

      本文标题:Flask框架实现文件服务器(支持上传和下载)

      本文链接:https://www.haomeiwen.com/subject/rldtnctx.html