文件上传与下载服务 | 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', 400file = 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', 404if __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 搭建一个简单的命令行文件共享服务。
相关文章:
文件上传与下载服务 | Flask 实战
之前介绍了 droppy 文件共享服务的搭建。但在一些场景中,我们需要在命令行或在 Python 代码中,临时上传和下载文件。这时可以用一个更简单的策略:使用 flask 编写一个临时的 API。 服务端配置 以下是一个简单的 Flask 应用程序代码示例&…...
MySQL 中的排序:索引排序与文件排序
文章目录 MySQL 中的排序:索引排序与文件排序全解析一、引言二、索引排序(一)原理(二)示例 三、文件排序(一)单路排序(二)双路排序(三)归并排序 四…...
深入理解React Hooks:使用useState和useEffect
引言 React Hooks是React 16.8引入的一项强大功能,它使函数组件能够使用状态和其他React特性。本文将深入探讨两个最常用的Hooks:useState和useEffect,并通过实际代码示例展示它们的使用方法。 1. 什么是React Hooks? React Ho…...
AWS codebuild + jenkins + github 实践CI/CD
前文 本文使用 Jenkins 结合 CodeBuild, CodeDeploy 实现 Serverless 的 CI/CD 工作流,用于自动化发布已经部署 lambda 函数。 在 AWS 海外区,CI/CD 工作流可以用 codepipeline 这项产品来方便的实现, CICD 基本概念 持续集成( Continuous…...
Android PMS(Package Manager Service)源码介绍
文章目录 前言一、PMS 启动流程二、APK 安装流程三、APK 卸载流程四、权限管理静态权限动态权限 五、 数据存储与一致性六、 PMS 的安全性策略1、权限检查2、签名认证3、动态权限管理4、应用安装验证5、保护系统目录 七、PMS 调试方法总结 前言 PackageManagerService…...
运维面试整理总结
面试题可以参考:面试题总结 查看系统相关信息 查看系统登陆成功与失败记录 成功:last失败:lastb 查看二进制文件 hexdump查看进程端口或连接 netstat -nltp ss -nltp补充:pidof与lsof命令 pidof [进程名] #根据 进程名 查询进程id ls…...
图数据库 Cypher语言
图数据库 属性图 属性图(Property Graph)概述 属性图是一种广泛用于建模关系数据的图数据结构,它将**顶点(节点)和边(关系)**进行结构化存储,并为它们附加属性以提供丰富的语义信…...
阿里云oss转发上线-实现不出网钓鱼
本地实现阿里云oss转发上线,全部代码在文末,代码存在冗余 实战环境 被钓鱼机器不出网只可访问内部网络包含集团oss 实战思路 若将我们的shellcode文件上传到集团oss上仍无法上线,那么就利用oss做中转使用本地转发进行上线,先发送…...
Spring Boot 3.4.0 发行:革新与突破的里程碑
🧑 博主简介:CSDN博客专家,历代文学网(PC端可以访问:https://literature.sinhy.com/#/literature?__c1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,…...
【网络安全】
黑客入侵 什么是黑客入侵? “黑客”是一个外来词,是英语单词hacker的中文音译。最初,“黑客”只是一个褒义词,指的是那些尽力挖掘计算机程序最大潜力的点脑精英,他们讨论软件黑客的技巧和态度,以及共享文化…...
在SQLyog中导入和导出数据库
导入 假如我要导入一个xxx.sql,我就先创建一个叫做xxx的数据库。 然后右键点击导入、执行SQL脚本 选择要导入的数据库文件的位置,点击执行即可 注意: 导入之后记得刷新一下导出 选择你要导出的数据库 右键选择:备份/导出、…...
RabbitMQ简单应用
概念 RabbitMQ 是一种流行的开源消息代理(Message Broker)软件,它实现了高级消息队列协议(AMQP - Advanced Message Queuing Protocol)。RabbitMQ 通过高效的消息传递机制,主要应用于分布式系统中解耦应用…...
使用LUKS对Linux磁盘进行加密
前言 本实验用于日常学习用,如需对存有重要数据的磁盘进行操作,请做好数据备份工作。 此实验只是使用LUKS工具的冰山一角,后续还会有更多功能等待探索。 LUKS(Linux Unified Key Setup)是Linux系统中用于磁盘加密的一…...
戴尔电脑安装centos7系统遇到的问题
1,找不到启动盘(Operation System Loader signature found in SecureBoot exclusion database(‘dbx’).All bootable devices failed secure Boot Verification) 关闭 Secure Boot(推荐): 进入 BIOS/UEFI…...
3.4.SynchronousMethodHandler组件之ResponseHandler
前言 feign发送完请求后, 拿到返回结果, 那么这个返回结果肯定是需要经过框架进一步处理然后再返回到调用者的, 其中ResponseHandler就是用来处理这个返回结果的, 这也是符合正常思维的处理方式, 例如springmvc部分在调用在controller端点前后都会增加扩展点。 从图中可以看得…...
Linux 下进程的状态
操作系统中常见进程状态 在操作系统中有六种常见进程状态: 新建状态: 进程正在被创建. 此时操作系统会为进程分配资源, 如: 内存空间等, 进行初始化就绪状态: 进程已经准备好运行了, 只需要等待被调度, 获取 CPU 资源就可以执行了, 操作系统中可能同时存在多个进程处于就绪状…...
【计算机网络】核心部分复习
目录 交换机 v.s. 路由器OSI七层更实用的TCP/IP四层TCPUDP 交换机 v.s. 路由器 交换机-MAC地址 链接设备和设备 路由器- IP地址 链接局域网和局域网 OSI七层 物理层:传输设备。原始电信号比特流。数据链路层:代表是交换机。物理地址寻址,交…...
Spring Boot开发实战:从入门到构建高效应用
Spring Boot 是 Java 开发者构建微服务、Web 应用和后端服务的首选框架之一。其凭借开箱即用的特性、大量的自动化配置和灵活的扩展性,极大简化了开发流程。本文将以实战为核心,从基础到高级,全面探讨 Spring Boot 的应用开发。 一、Spring B…...
pyshark安装使用,ubuntu:20.04
1.容器创建 命令 docker run -d --name pyshark -v D:\src:/root/share ubuntu:2004 /bin/bash -c "while true;do sleep 1000;done" 用于创建并启动一个新的 Docker 容器。 docker run -d --name pyshark -v D:\src:/root/share ubuntu:2004 /bin/bash -c "w…...
基本功能实现
目录 1、环境搭建 2、按键控制灯&电机 LED 电机 垂直按键(机械按键) 3、串口调试功能 4、定时器延时和定时器中断 5、振动强弱调节 6、万年历 7、五方向按键 1、原理及分析 2、程序设计 1、环境搭建 需求: 搭建一个STM32F411CEU6工程 分析: C / C 宏定义栏…...
别再只调PID了!基于STM32C8T6的电磁循迹小车,从硬件滤波到软件算法的抗干扰全攻略
电磁循迹小车的抗干扰实战:从硬件滤波到软件优化的全链路解决方案 当你的电磁循迹小车在实验室里跑得风生水起,一到比赛现场却频频"抽风",这往往不是PID参数调得不够好,而是整个系统的抗干扰设计存在漏洞。本文将带你深…...
RK3588开发板跑YOLOv5视频流demo,遇到Segmentation fault别慌!保姆级core文件生成与调试指南
RK3588开发板YOLOv5视频流推理崩溃排查:从Segmentation fault到精准调试全攻略 当你在RK3588开发板上满心期待地运行YOLOv5视频流推理demo时,屏幕上突然闪现的"Segmentation fault (core dumped)"就像一盆冷水浇灭了热情。这种崩溃提示信息量极…...
OpenClaw对话增强:nanobot模型微调提升任务理解准确率
OpenClaw对话增强:nanobot模型微调提升任务理解准确率 1. 为什么需要专业场景的模型微调 在测试OpenClaw基础版本时,我发现一个明显痛点:当处理专业领域的自动化任务时,通用大模型经常出现"理解偏差"。比如在医疗文献…...
8路HD-SDI录播主机CYS-08
在广电录制、教育录播、会议记录等场景中,稳定、高清、易管理的视频录制设备至关重要。春源丽影CYS-08 推出的8路HD-SDI硬盘录像机,凭借全接口支持、双编码技术、智能存储等核心优势,为多路高清录制需求提供了专业级解决方案。8路高清输入&am…...
vLLM-v0.17.1参数详解:--disable-log-stats与--log-level日志调优
vLLM-v0.17.1参数详解:--disable-log-stats与--log-level日志调优 1. vLLM框架简介 vLLM是一个专为大型语言模型(LLM)设计的高性能推理和服务库,以其出色的吞吐量和易用性著称。这个项目最初由加州大学伯克利分校的天空计算实验室开发,现在…...
OpenClaw配置备份指南:GLM-4.7-Flash环境快速迁移方案
OpenClaw配置备份指南:GLM-4.7-Flash环境快速迁移方案 1. 为什么需要环境迁移? 上周我的主力开发机突然硬盘故障,导致精心配置的OpenClaw环境全部丢失。重装后发现要重新对接GLM-4.7-Flash模型、配置飞书通道、安装十几个自定义技能——这个…...
部署开源的Minecraft服务器智能运维管理系统 Minecraft-Rcon-Manage 自存简易教程
项目地址:Minecraft-Rcon-Manage 前言 笔者最近寻找一款能实现Minecraft服务器RCON远程访问的工具,找到了这个目前正在持续更新、功能丰富的开源项目Minecraft-Rcon-Manage,但实际部署过程中发现作者提供的教程博客无法正常访问,…...
5步实现Switch控制器PC全功能适配:从连接到精通的设备适配指南
5步实现Switch控制器PC全功能适配:从连接到精通的设备适配指南 【免费下载链接】BetterJoy Allows the Nintendo Switch Pro Controller, Joycons and SNES controller to be used with CEMU, Citra, Dolphin, Yuzu and as generic XInput 项目地址: https://gitc…...
【LAMMPS实战】从文献到模拟:精准定位与获取ReaxFF反应力场参数文件
1. 初识ReaxFF反应力场:为什么我们需要它? 第一次接触分子动力学模拟时,我完全被各种力场搞晕了。直到遇到需要模拟化学反应的情况,才发现普通的力场根本不够用。这时候ReaxFF反应力场就像救命稻草一样出现了。简单来说࿰…...
AT32F435_437_USB_MSC_SDIO:实现高效SD卡U盘功能的开发指南
1. 从零开始:AT32F435/437的USB MSC功能初探 第一次接触AT32F435/437的USB大容量存储设备(MSC)功能时,我完全被它的实用性惊艳到了。想象一下,你的嵌入式设备突然变身成电脑上的U盘,可以直接拖拽文件读写SD卡,这对数据…...
