当前位置: 首页 > news >正文

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博客

http://www.dtcms.com/a/95497.html

相关文章:

  • Spring容器从启动到关闭的注解使用顺序及说明
  • LVS的三种工作模式简述
  • 在linux系统上卸载并重新安装Docker及配置国内镜像源指
  • Open Graph 社交卡片介绍:让网站在社群上被漂亮分享
  • jEasyUI 创建自定义视图
  • 通过TIM+DMA Burst 实现STM32输出变频且不同脉冲数量的PWM波形
  • 漏洞发现:AWVS 联动 XRAY 图形化工具.(主动+被动 双重扫描)
  • css 实现闪烁光标
  • DaemonSet 与 Deployment 的主要区别
  • 使用 Layers 扩展你的 Nuxt4 应用
  • VScode-i18n-ally-Vue
  • “线程通信“一个案例
  • 仓储物流中UWB标签实现货物实时追踪的技术路径与品铂科技方案解析
  • MySQL、创建数据库、表、SQL 函数:数学函数、字符串函数、日期函数、聚合函数
  • 怎么使用pm2启动和暂停后端程序(后端架构nodejs+koa)
  • 【学Rust写CAD】14线性插值函数(加入color.rs)
  • Docker 快速入门指南
  • 【安全运营】关于攻击面管理相关概念的梳理(二)
  • Ubuntu 24.04 安装 Docker 详细教程
  • SQL server中的事务与锁
  • 华为HG532路由器RCE漏洞 CVE-2017-17215 复现
  • 批量给 PDF 页面添加超链接
  • Flink实战教程从入门到精通(基础篇)(五)Flink部署-YARN运行模式
  • 风险研究 | AI 安全警钟响起:Manus AI 漏洞暴露的背后真相
  • LeetCode 第36、37题(数独问题)
  • spring ApplicationContext 继承的这些接口作用,示例,表格对比
  • 华为单臂路由 与 策略路由
  • SpringCould微服务架构之Docker(4)
  • chrome插件开发之API解析-chrome.scripting.executeScript()
  • 基于网启PXE服务器的批量定制系统平台(详细版)