文件上传与下载服务 | Flask 实战

之前介绍了 droppy 文件共享服务的搭建。但在一些场景中,我们需要在命令行或在 Python 代码中,临时上传和下载文件。这时可以用一个更简单的策略:使用 flask 编写一个临时的 API。

服务端配置

以下是一个简单的 Flask 应用程序代码示例,用于处理文件的上传和下载。

# server.py
from flask import Flask, request, send_from_directory, jsonify
import os

# 创建 'uploads' 目录,如果不存在
os.makedirs('uploads', exist_ok=True)

app = Flask(__name__)

@app.route('/upload', methods=['POST'])
def upload_file():
    if 'file' not in request.files:
        return 'No file part', 400
    
    file = request.files['file']
    if file.filename == '':
        return 'No selected file', 400

    # 保存文件到服务器
    file.save(os.path.join('uploads', file.filename))
    return 'File uploaded successfully', 200

@app.route('/files', methods=['GET'])
def list_files():
    # 获取 'uploads' 目录中的文件列表
    files = os.listdir('uploads')
    return jsonify(files), 200

@app.route('/download/<filename>', methods=['GET'])
def download_file(filename):
    # 下载指定的文件
    try:
        return send_from_directory('uploads', filename, as_attachment=True)
    except FileNotFoundError:
        return 'File not found', 404

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000)

运行 python server.py 命令启动服务。

客户端交互

在代码中上传:将 file_path 填写为实际需要上传的文件,并相应修改 host 地址。

import requests

# 要上传的文件路径
file_path = 'path_to_your_file.txt'

with open(file_path, 'rb') as f:
    files = {'file': f}
    response = requests.post('http://server1_ip:5000/upload', files=files)

print(response.text)

也可以写成 Python 脚本形式,编写命令行工具 client.py,这里包括三个函数:

  • upload 上传文件
  • list_files 查看文件列表
  • download 下载文件

完整代码:

import requests
import click
from loguru import logger

@click.group()
def cli():
    """文件管理客户端."""
    pass

@cli.command()
@click.option('--file', 'file_path', required=True, type=click.Path(exists=True), help='要上传的文件路径')
@click.option('--server-host', 'server_host', required=True, type=str, help='服务器的主机地址(包含IP和端口)')
def upload(file_path, server_host):
    """上传文件到指定服务器."""
    url = f"http://{server_host}/upload"
    logger.info(f"正在上传 {file_path}{url}")
    
    with open(file_path, 'rb') as f:
        files = {'file': f}
        try:
            response = requests.post(url, files=files)
            response.raise_for_status()
            logger.info(f"服务器返回: {response.text}")
        except requests.RequestException as e:
            logger.error(f"发生错误: {e}")

@cli.command()
@click.option('--server-host', 'server_host', required=True, type=str, help='服务器的主机地址(包含IP和端口)')
def list_files(server_host):
    """查看服务器上的文件列表."""
    url = f"http://{server_host}/files"
    logger.info(f"正在从 {url} 检索文件列表")
    try:
        response = requests.get(url)
        response.raise_for_status()
        files = response.json()
        if files:
            logger.info("服务器上的文件列表:")
            for file in files:
                logger.info(f"- {file}")
        else:
            logger.info("服务器上没有可用文件。")
    except requests.RequestException as e:
        logger.error(f"发生错误: {e}")

@cli.command()
@click.option('--filename', 'filename', required=True, type=str, help='要下载的文件名')
@click.option('--server-host', 'server_host', required=True, type=str, help='服务器的主机地址(包含IP和端口)')
def download(filename, server_host):
    """从服务器下载文件."""
    url = f"http://{server_host}/download/{filename}"
    logger.info(f"正在下载 {filename}{url}")
    try:
        response = requests.get(url, stream=True)
        response.raise_for_status()
        with open(filename, 'wb') as f:
            for chunk in response.iter_content(chunk_size=8192):
                f.write(chunk)
        logger.info(f"{filename} 下载成功")
    except requests.RequestException as e:
        logger.error(f"发生错误: {e}")

if __name__ == '__main__':
    cli()

使用示例

在命令行中执行以下命令来上传、查看和下载文件:

上传文件:

python client.py upload --file path_to_your_file --server-host localhost:5000

查看文件列表:

python client.py list_files --server-host localhost:5000

下载文件:

python client.py download --filename file_name --server-host localhost:5000

以上,我们用 Python 的 flask 和 click 搭建一个简单的命令行文件共享服务。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/925191.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

新型大语言模型的预训练与后训练范式,苹果的AFM基础语言模型

前言&#xff1a;大型语言模型&#xff08;LLMs&#xff09;的发展历程可以说是非常长&#xff0c;从早期的GPT模型一路走到了今天这些复杂的、公开权重的大型语言模型。最初&#xff0c;LLM的训练过程只关注预训练&#xff0c;但后来逐步扩展到了包括预训练和后训练在内的完整…

网络知识1-TCP/IP模型

从用户端到服务端&#xff0c;tcp/ip模型可分为应用层、传输层、网络层、网络接口层 以下使用寄快递为例进行解释 应用层职责&#xff1a; 只关注与为用户提供应用功能&#xff0c;如HTTP、FTP、telnet、DNS、SMTP等 &#xff0c;应用层的职责就像我们寄快递时将快递给快递员…

【计算机视觉】图像基本操作

1. 数字图像表示 一幅尺寸为MN的图像可以用矩阵表示&#xff0c;每个矩阵元素代表一个像素&#xff0c;元素的值代表这个位置图像的亮度&#xff1b;其中&#xff0c;彩色图像使用3维矩阵MN3表示&#xff1b;对于图像显示来说&#xff0c;一般使用无符号8位整数来表示图像亮度&…

爬虫与反爬-旋转验证码突破方案(知名短视频、TK海外版 及 某东等等)

概述&#xff1a;文本对旋转验证码进行了突破及讲述了实现原理&#xff0c;代码使用纯算法 OpenCV&#xff0c;使用代价较小同时不用安装一大堆AI训练相关的模组&#xff0c;方便且能够快速上手 当前亲自验证了能够支持的网站&#xff1a;国内知名短视频平台、海外版 以及 某东…

STM32C011开发(1)----开发板测试

STM32C011开发----1.开发板测试 概述硬件准备视频教学样品申请源码下载参考程序生成STM32CUBEMX串口配置LED配置堆栈设置串口重定向主循环演示 概述 STM32C011F4P6-TSSOP20 评估套件可以使用户能够无缝评估 STM32C0 系列TSSOP20 封装的微控制器功能&#xff0c;基于 ARM Corte…

达梦数据库文件故障的恢复方法

目录 1、概述 1.1 概述 1.2 环境介绍 2、使用备份集的恢复方法 2.1 实验准备 2.2 误删除“用户表空间数据文件” 2.3 误删除SYSTEM.DBF 2.4 误删除ROLL.DBF 2.5 REDO日志文件 3、无备份集的恢复方法 3.1 误删除“表空间数据文件” 3.2误删除控制文件 3.3 误删除RO…

JVM:即时编译器,C2 Compiler,堆外内存排查

1&#xff0c;即时编译器 1.1&#xff0c;基本概念 常见的编译型语言如C&#xff0c;通常会把代码直接编译成CPU所能理解的机器码来运行。而Java为了实现“一次编译&#xff0c;处处运行”的特性&#xff0c;把编译的过程分成两部分&#xff0c;首先它会先由javac编译成通用的…

rocylinux9.4安装prometheus监控

一.上传软件包 具体的软件包如下&#xff0c;其中kubernetes-mixin是下载的监控kubernetes的一些监控规则、dashbaordd等。 二.Prometheus配置 1.promethes软件安装 #解压上传后的软件包 [rootlocalhost ] cd /opt [rootlocalhost opt]# tar xf prometheus-2.35.3.linux-amd…

FreeRTOS之链表源码分析

文章目录 前言一、结构体1、链表List_t2、链表项xLIST_ITEM3、头节点xMINI_LIST_ITEM4、链表示意图 二、函数分析1、初始化函数vListInitialise2、初始化链表项vListInitialiseItem3、链表尾部添加节点vListInsertEnd4、按序插入节点vListInsert5、删除节点uxListRemove 总结 前…

预测未来 | MATLAB实现Transformer时间序列预测未来

预测未来 | MATLAB实现Transformer时间序列预测未来 预测效果 基本介绍 1.Matlab实现Transformer时间序列预测未来&#xff1b; 2.运行环境Matlab2023b及以上&#xff0c;data为数据集&#xff0c;单变量时间序列预测&#xff1b; 3.递归预测未来数据&#xff0c;可以控制预…

怎么样才算得上熟悉高并发编程?

提到并发编程很多人就会头疼了&#xff1b;首先就是一些基础概念&#xff1a;并发&#xff0c;并行&#xff0c;同步&#xff0c;异步&#xff0c;临界区&#xff0c;阻塞&#xff0c;非阻塞还有各种锁全都砸你脸上&#xff0c;随之而来的就是要保证程序运行时关键数据在多线程…

最新 Blender 4.2 保姆级安装教程(附安装包)

目录 Blender介绍&#xff1a; Blender下载&#xff1a; Blender改进功能&#xff1a; Blender介绍&#xff1a; Blender是一款开源的跨平台全能三维动画制作软件&#xff0c;提供从建模、渲染、动画、特效、合成到音频处理、视频剪辑等一系列动画短片制作解决方案。它支持…

web安全之信息收集

在信息收集中,最主要是就是收集服务器的配置信息和网站的敏感信息,其中包括域名及子域名信息,目标网站系统,CMS指纹,目标网站真实IP,开放端口等。换句话说,只要是与目标网站相关的信息,我们都应该去尽量搜集。 1.1收集域名信息 知道目标的域名之后,获取域名的注册信…

网络原理(一)—— http

什么是 http http 是一个应用层协议&#xff0c;全称为“超文本传输协议”。 http 自 1991 年诞生&#xff0c;目前已经发展为最主流使用的一种应用层协议。 HTTP 往往基于传输层的 TCP 协议实现的&#xff0c;例如 http1.0&#xff0c;http1.0&#xff0c;http2.0 http3 是…

第四十二篇 EfficientNet:重新思考卷积神经网络的模型缩放

文章目录 摘要1、简介2、相关工作3、复合模型缩放3.1、 问题公式化3.2、扩展维度3.3、复合比例 4、EfficientNet架构5、实验5.1、扩展MobileNets和ResNets5.2、EfficientNet的ImageNet结果5.3、EfficientNet的迁移学习结果 6、讨论7、结论 摘要 卷积神经网络(ConvNets)通常在固…

典型组合逻辑电路设计

目录 行为级描述方式基本运算电路 一、半加器&#xff08;Half Adder&#xff09; 二、全加器&#xff08;Full Adder&#xff09; 1、逻辑门构成加法器 2、集成全加器 3、串行加法器 4、超前进位加法器 三、全减器(Full Deductor) 数值比较电路 一、一位比较器 二、…

【论文阅读】三平面相关与变体

文章目录 1. 【CVPR2023】Tri-Perspective View for Vision-Based 3D Semantic Occupancy Prediction动机可视化方法Pipeline 2. 【2023/08/31】PointOcc: Cylindrical Tri-Perspective View for Point-based 3D Semantic Occupancy Prediction动机&#xff08;针对雷达点云、与…

修改bag的frame_id的工具srv_tools

在使用数据集导航或者建图时&#xff0c;bag中的点云或者其他话题的frame_id没有和需要的对应 1.创建工作空间 2.cd xxxx/src 3.git clone https://github.com/srv/srv_tools.git cd .. catkin_make source ./devel/setup.bash rosrun bag_tools change_frame_id.py -t /要改…

hue 4.11容器化部署,已结合Hive与Hadoop

配合《Hue 部署过程中的报错处理》食用更佳 官方配置说明页面&#xff1a; https://docs.gethue.com/administrator/configuration/connectors/ 官方配置hue.ini页面 https://github.com/cloudera/hue/blob/master/desktop/conf.dist/hue.ini docker部署 注意&#xff1a; …

如何用Excel做数据可视化自动化报表?

作为一个经常需要做数据报表的人&#xff0c;我最常用的工具是Excel&#xff0c;对于我来说用Excel处理繁琐冗杂的数据并不难&#xff0c;但是我发现身边很多人用Excel做的数据报表非常的耗时&#xff0c;而且最后的成品也是难以直视&#xff0c;逻辑和配色等都非常的“灾难”。…