python(26) : 文件上传及下载和预览

# -*- coding: utf-8 -*-

# ====> 上传文件 <==== #

import os

from flask import Flask, jsonify, request, send_file
from flask_cors import CORS
import logging

# 创建一个logger
lg = logging.getLogger('logger')

app = Flask(__name__)

# 设置文件上传大小限制为500MB
app.config['MAX_CONTENT_LENGTH'] = 500 * 1024 * 1024
CORS(app)
file_save_folder = os.getcwd() + os.sep + 'files'
os.makedirs(file_save_folder, exist_ok=True)

f_debug = False
f_port = 7001


def make_api_response_failed(data=None):
    rs = {
        'success': False,
        'msg': '',
        'code': 400,
        'data': data
    }
    return jsonify(rs)


def make_api_response(data=None):
    rs = {
        'success': True,
        'msg': None,
        'code': 200,
        'data': data
    }
    return jsonify(rs)


@app.route('/api/upload', methods=['POST'])
def upload():
    try:
        if 'file' not in request.files:
            return make_api_response_failed(msg=f'请求中没有文件部分')
        file = request.files['file']
        if file.filename == '' or not file:
            return make_api_response_failed(msg=f'未选择文件')
        filename = file.filename
        filepath = os.path.join(file_save_folder, filename)
        file.save(filepath)
        url = f'http://127.0.0.1:{f_port}/api/download/{filename}'
        res = {
            'url': url,
            'file_name': filename,
            'filepath': filepath
        }
        return make_api_response(res)
    except Exception:
        lg.error("文件上传出错: ", exc_info=True)
        return make_api_response_failed(msg=f'文件上传出错')


@app.route('/api/download/<string:filename>', methods=['GET'])
def download(filename):
    try:
        return send_file(os.path.join(file_save_folder, filename), as_attachment=False)
    except Exception:
        lg.error("文件下载出错: ", exc_info=True)
        return make_api_response_failed(msg=f'文件下载出错')


if __name__ == '__main__':
    lg.info(f'开始启动文件管理服务,端口为:{f_port}, 是否开启debug:{f_debug}')
    app.run(host='0.0.0.0', port=f_port, debug=f_debug)

前端代码参考: 前端技术(28) : 拖拽、粘贴和点击浏览文件上传-CSDN博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值