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

Python后端flask框架接收zip压缩包方法

一、用base64编码发送,以及接收

import base64
import io
import zipfile
from flask import request, jsonifydef unzip_and_find_png(zip_data):# 使用 BytesIO 在内存中处理 zip 数据with zipfile.ZipFile(io.BytesIO(zip_data), 'r') as zip_ref:extracted_paths = []for file_name in zip_ref.namelist():if file_name.lower().endswith('.png'):  # 只提取 PNG 文件# 保存文件内容到内存中或其他处理逻辑extracted_paths.append(file_name)return extracted_paths@app.route('/upload_zip', methods=['POST'])
def upload_zip():# 从请求数据中获取 Base64 格式的 zip 文件encoded_zip = request.json.get('imagesZipBase64', '')if encoded_zip == '':res = {"ret": 1, "msg": "No valid images zip's Base64 data", "labels": []}return jsonify(res), 200try:# 解码 Base64 数据为字节数据zip_data = base64.b64decode(encoded_zip)# 解压并查找 PNG 文件image_paths = unzip_and_find_png(zip_data)if len(image_paths) == 0:res = {"ret": 1, "msg": "No valid images in zip", "labels": []}return jsonify(res), 200# 返回找到的 PNG 文件路径列表res = {"ret": 0, "msg": "Images found", "labels": image_paths}return jsonify(res), 200except Exception as e:res = {"ret": 1, "msg": f"Error processing zip file: {str(e)}", "labels": []}return jsonify(res), 200

  • 模拟发送

import base64
import requestsdef zip_to_base64(zip_path):"""读取本地 zip 文件并将其转换为 Base64 编码的字符串。:param zip_path: str, 本地 zip 文件路径:return: str, Base64 编码的字符串"""try:with open(zip_path, 'rb') as file:zip_data = file.read()base64_encoded = base64.b64encode(zip_data).decode('utf-8')  # 转换为 Base64 并解码为字符串return base64_encodedexcept Exception as e:print(f"Error reading zip file: {e}")return Nonedef send_base64_to_api(base64_data, api_url):"""将 Base64 编码的 zip 数据发送到指定 API。:param base64_data: str, Base64 编码的 zip 数据:param api_url: str, API 的地址:return: Response, 请求返回的响应"""payload = {"imagesZipBase64": base64_data  # API 要求的字段名}try:headers = {'Content-Type': 'application/json'}response = requests.post(api_url, json=payload, headers=headers)return responseexcept Exception as e:print(f"Error sending request to API: {e}")return Noneif __name__ == "__main__":# 本地 zip 文件路径zip_file_path = "example.zip"# 将 zip 文件转换为 Base64base64_encoded_zip = zip_to_base64(zip_file_path)if not base64_encoded_zip:print("Failed to encode zip file to Base64.")exit()# 目标 API 地址api_endpoint = "http://localhost:5000/get_multi_labels"  # 替换为实际 API 地址# 发送请求response = send_base64_to_api(base64_encoded_zip, api_endpoint)if response is not None:print(f"API Response Status: {response.status_code}")print(f"API Response Data: {response.json()}")else:print("Failed to send data to API.")

二、其他方法

1. 使用 HTTP multipart/form-data 上传 -- 推荐

这是最常见的方法,适合中等大小的文件(如几十 MB)。其他后端通过 HTTP POST 请求将文件作为表单数据发送到 Flask。

Flask 后端代码:

from flask import Flask, request, jsonifyapp = Flask(__name__)# 配置最大上传文件大小(如 500 MB)
app.config['MAX_CONTENT_LENGTH'] = 500 * 1024 * 1024  # 500 MB@app.route('/upload_zip', methods=['POST'])
def upload_zip():# 检查是否包含文件if 'file' not in request.files:return jsonify({"ret": 1, "msg": "No file uploaded"})zip_file = request.files['file']# 检查文件是否有效if zip_file.filename == '':return jsonify({"ret": 1, "msg": "Empty filename"})# 保存文件到本地save_path = f"./uploads/{zip_file.filename}"zip_file.save(save_path)return jsonify({"ret": 0, "msg": f"File '{zip_file.filename}' uploaded successfully", "path": save_path})if __name__ == "__main__":app.run(debug=True)

其他后端代码示例(Python Requests):

import requests
file_path = "large_file.zip"  # 本地文件路径
url = "http://flask-server-address/upload_zip"
with open(file_path, 'rb') as f:response = requests.post(url, files={'file': f})
print(f"Response: {response.status_code}, Data: {response.json()}")

特点:

  • 优点:实现简单,支持多语言,适合中小型文件传输。

  • 缺点:对于超大文件(>500 MB),容易造成内存和带宽压力。

2. 使用流式传输(Chunked Transfer Encoding)

对于超大文件,流式传输是更优的选择。其他后端将文件逐块读取并发送,Flask 后端逐块接收并处理。

Flask 后端代码:

from flask import Flask, request, jsonify
app = Flask(
__name__
)
@app.route('/upload_large_zip', methods=['POST'])
def upload_large_zip():try:save_path = "./uploads/large_file.zip"with open(save_path, 'wb') as f:# 按块读取请求数据并写入文件for chunk in request.stream:f.write(chunk)return jsonify({"ret": 0, "msg": "File uploaded successfully", "path": save_path})except Exception as e:return jsonify({"ret": 1, "msg": f"Error: {str(e)}"})
if 
name== "
__main__
":app.run(debug=True)

其他后端代码示例(Python Requests):

import requests
file_path = "large_file.zip"
url = "http://flask-server-address/upload_large_zip"
def file_chunk_reader(file_path, chunk_size=1024 * 1024):  # 1 MBwith open(file_path, 'rb') as f:while chunk := f.read(chunk_size):yield chunk
response = requests.post(url, data=file_chunk_reader(file_path))
print(f"Response: {response.status_code}, Data: {response.json()}")

特点:

  • 优点

    • 内存占用低。

    • 可处理超大文件(如 >1 GB)。

  • 缺点

    • 需要其他后端支持流式上传。

3. 使用文件存储服务(如 S3、OSS)作为中间媒介

如果文件非常大且需要高效传输,可以通过云存储服务作为中转。其他后端将文件上传到云存储,Flask 后端只需下载即可。

流程:

  1. 其他后端将 .zip 文件上传到 S3、OSS 或其他文件存储服务。

  2. 上传完成后,通知 Flask 后端文件的下载 URL。

  3. Flask 后端通过 URL 下载文件进行处理。

Flask 后端代码:

import requests
from flask import Flask, request, jsonify
app = Flask(
__name__
)
@app.route('/fetch_file', methods=['POST'])
def fetch_file():data = request.get_json()file_url = data.get('file_url')if not file_url:return jsonify({"ret": 1, "msg": "No file URL provided"})save_path = "./uploads/remote_file.zip"try:response = requests.get(file_url, stream=True)response.raise_for_status()  # 检查请求是否成功with open(save_path, 'wb') as f:for chunk in response.iter_content(chunk_size=1024 * 1024):  # 1 MBf.write(chunk)return jsonify({"ret": 0, "msg": "File fetched successfully", "path": save_path})except Exception as e:return jsonify({"ret": 1, "msg": f"Error fetching file: {str(e)}"})
if 
name== "
__main__
":app.run(debug=True)

特点:

  • 优点

    • 避免直接传输大文件,节省带宽。

    • 利用云存储服务的高效上传下载能力。

  • 缺点

    • 需要配置云存储服务权限和 URL 签名。


4. 使用 WebSocket 或 TCP 直接传输

如果需要更低延迟和更高效的传输,可以考虑使用 WebSocket 或 TCP 传输协议。此方法适合实时性高、带宽充足的场景。

WebSocket 示例(后端使用 Flask-SocketIO):

from flask import Flask
from flask_socketio import SocketIO
app = Flask(
__name__
)
socketio = SocketIO(app)
@socketio.on('upload_chunk')
def handle_upload_chunk(data):# 每次收到一个文件块时处理chunk = data.get('chunk')with open("./uploads/large_file.zip", 'ab') as f:f.write(chunk)
if 
name== "
__main__
":socketio.run(app, debug=True)

选择方案的建议:

文件大小推荐方案
小文件(<50 MB)使用 HTTP multipart/form-data 上传
中等文件(50-500 MB)使用流式传输
大文件(>500 MB)使用文件存储服务(如 S3/OSS),或者流式传输
实时数据使用 WebSocket 或 TCP

根据文件大小和后端需求选择合适的方案,同时要考虑文件存储路径、权限管理以及网络稳定性等因素。

相关文章:

Python后端flask框架接收zip压缩包方法

一、用base64编码发送&#xff0c;以及接收 import base64 import io import zipfile from flask import request, jsonifydef unzip_and_find_png(zip_data):# 使用 BytesIO 在内存中处理 zip 数据with zipfile.ZipFile(io.BytesIO(zip_data), r) as zip_ref:extracted_paths…...

机器学习中数据集Upsampling和Downsampling是什么意思?中英文介绍

对GPT4o大模型的Prompt如下&#xff1a; Datasets marked with ↓ are downsampled from their original datasets, datasets marked with ↑ are upsampled.这里的上采样和下采样是什么意思 内容援引自&#xff1a;paper &#xff08;https://allenai.org/papers/tulu-3-repor…...

浏览器控制台中使用ajax下载文件(没有postman等情况下)

有时候&#xff0c;可能电脑里面没有postman&#xff08;比如内网&#xff09;&#xff0c;然后又需要导出一些文件&#xff0c;前端又没有提供相应的功能&#xff08;比如循环调用导出等&#xff09;&#xff0c;这时候我们就可以通过在控制台写代码的方式来实现了。这个还是在…...

完全二叉树的基本操作(顺序存储)

#include<iostream> #include<math.h> using namespace std;#define MaxSize 100 struct TreeNode {int value;bool isEmpty;//判断该节点是否为空 }t[MaxSize];/** *定义一个长度位MaxSize的数组&#xff0c;按照从上到下&#xff0c; *从左到右的方式依次存储完全…...

【HTTP】http与https

http与https的关系 应用层协议&#xff1a; http&#xff08;HyperText Transfer Protocol&#xff09;超文本传输协议&#xff1b; https&#xff08;Hypertext Transfer Protocol Secure&#xff09;超文本传输安全协议&#xff1b; 传输层协议&#xff1a;TCP&#xff08;Tr…...

【Git多人开发与协作之团队的环境搭建】

Git多人开发与协作之团队的环境搭建 新的改变1. Git 的用途2. 分支的概念与类型3. HEAD 和分支指针如何查看 HEAD 指向的位置&#xff1a; 4. 常见的 Git 操作5. 常见问题与解决方法总结GitHub 项目获取实操在新电脑上运行 Git1. 安装 Git2. 配置用户名和邮箱3.配置 Git 和 SSH…...

java基础概念36:正则表达式1

一、正则表达式的作用 作用一&#xff1a;校验字符串是否满足规则&#xff1b;作用二&#xff1a;在一段文本中查找满足要求的内容。——爬虫 二、正则表达式 2-1、字符类 示例&#xff1a; public static void main(String[] args) {System.out.println("a".matc…...

java实现小程序接口返回Base64图片

文章目录 引言I java 接口返回Base64图片接口设计获取验证码图片-base64字符串获取验证码图片-二进制流arraybufferII 小程序端代码过期代码: 显示文件流图片(arraybuffer)知识扩展:微信小程序下载后端返回的文件流引言 场景: 图形验证码 背景: 接口返回arraybuffer的格式…...

网络编程并发服务器的应用

作业2&#xff1a;完成局域网CS模型&#xff0c;局域网内一个服务器&#xff0c;多个客户端连接一个服务器&#xff0c;完成局域网聊天&#xff08;select函数&#xff0c;poll函数&#xff0c;完成TCP并发服务器&#xff09;。 poll函数应用&#xff1a; 服务器部分代码&…...

数据结构——停车场管理问题

目录 1、问题描述2、逐步分析1&#xff09;涉及操作2&#xff09;代码实现 3、代码整合 1、问题描述 1、题目 设停车场内只有一个可停放n辆汽车的狭长通道&#xff0c;且只有一个大门可供汽车进出。汽车在停车场内按车辆到达时间的先后顺序&#xff0c;依次由北向南排列&#x…...

道品智能科技移动式水肥一体机:农业灌溉施肥的革新之选

在现代农业的发展进程中&#xff0c;科技的力量正日益凸显。其中&#xff0c;移动式水肥一体机以其独特的可移动性、智能化以及实现水肥一体化的卓越性能&#xff0c;成为了农业领域的一颗璀璨新星。它不仅改变了传统的农业灌溉施肥方式&#xff0c;更为农业生产带来了高效、精…...

AI实习--常用的Linux命令

一、基础命令 1. 切换到根目录。 cd ~ 2. 返回上一级目录。 cd .. 3. 查看当前目录下包括哪些文件和文件夹。 ls 4. 查看当前路径。 pwd 5. 将文件或文件夹剪切到目标目录下。 mv 文件所在路径 目标路径 6. 查看文本文件内容。 cat 文本文件名 7. 创建文件或文件夹…...

Python学习指南 + 谷歌浏览器如何安装插件

找往期文章包括但不限于本期文章中不懂的知识点&#xff1a; 个人主页&#xff1a;我要学编程(ಥ_ಥ)-CSDN博客 所属专栏&#xff1a; Python 目录 前言 Python 官方文档的使用 谷歌浏览器中如何安装插件 前言 在学习Python时&#xff0c;我们可能会出现这样的困惑&#x…...

研0找实习【学nlp】15---我的后续,总结(暂时性完结)

当下进展成果&#xff1a; nlptransformerpytorchhuggingfacebert简历环境配置表情识别文本分类 断更了快1个月&#xff0c;2个礼拜找实习&#xff0c;1个礼拜伤心&#xff0c;1个礼拜想我要干什么…… 承认自己的才疏学浅&#xff0c;了解了leetcode&#xff0c;和老师商量了…...

kylin麒麟银河桌面版操作系统安装部署

本文主要描述kylin麒麟银河桌面版操作系统的安装&#xff0c;该操作系统的安装源文件可以从kylin麒麟银河官方网站上下载&#xff0c;商业版本需要申请试用&#xff0c;开源版本可以直接下载使用。 如上所示&#xff0c;x86芯片处理器架构的请下载INTEL版本&#xff0c;华为海思…...

MyBatis插件原理及应用

&#x1f3ae; 作者主页&#xff1a;点击 &#x1f381; 完整专栏和代码&#xff1a;点击 &#x1f3e1; 博客主页&#xff1a;点击 文章目录 介绍<plugins>标签解析拦截器链的工作原理插件的应用场景MyBatis插件应用的四个组件InterceptorChain和Interceptor MyBatis框架…...

[M最短路] lc743. 网络延迟时间(spfa最短路+单源最短路)

文章目录 1. 题目来源2. 题目解析 1. 题目来源 链接&#xff1a;743. 网络延迟时间 相关链接&#xff1a; [图最短路模板] 五大最短路常用模板) 2. 题目解析 怎么讲呢&#xff0c;挺抽象的…很久没写最短路算法了。反正也是写出来了&#xff0c;但脱离了模板&#xff0c;把…...

MySQL 中的锁

MySQL 中的锁&#xff1a;全面解析与应用指南 在 MySQL 数据库的复杂世界里&#xff0c;锁是确保数据一致性、完整性以及并发控制的关键机制。无论是简单的小型应用还是复杂的企业级系统&#xff0c;深入理解 MySQL 中的锁对于优化数据库性能、避免数据冲突和错误都具有至关重要…...

【动手学电机驱动】STM32-FOC(8)MCSDK Profiler 电机参数辨识

STM32-FOC&#xff08;1&#xff09;STM32 电机控制的软件开发环境 STM32-FOC&#xff08;2&#xff09;STM32 导入和创建项目 STM32-FOC&#xff08;3&#xff09;STM32 三路互补 PWM 输出 STM32-FOC&#xff08;4&#xff09;IHM03 电机控制套件介绍 STM32-FOC&#xff08;5&…...

【C++11】尽显锋芒

(续) 一、可变参数模板 C11支持可变参数模板&#xff0c;也就是说支持可变数量参数的函数模板和类模板&#xff0c;可变数目的参数被称 为参数包&#xff0c;存在两种参数包&#xff1a;模板参数包&#xff0c;表示零或多个模板参数&#xff1b;函数参数包&#xff1a;表示零…...

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇&#xff0c;在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下&#xff1a; 【Note】&#xff1a;如果你已经完成安装等操作&#xff0c;可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作&#xff0c;重…...

PPT|230页| 制造集团企业供应链端到端的数字化解决方案:从需求到结算的全链路业务闭环构建

制造业采购供应链管理是企业运营的核心环节&#xff0c;供应链协同管理在供应链上下游企业之间建立紧密的合作关系&#xff0c;通过信息共享、资源整合、业务协同等方式&#xff0c;实现供应链的全面管理和优化&#xff0c;提高供应链的效率和透明度&#xff0c;降低供应链的成…...

spring:实例工厂方法获取bean

spring处理使用静态工厂方法获取bean实例&#xff0c;也可以通过实例工厂方法获取bean实例。 实例工厂方法步骤如下&#xff1a; 定义实例工厂类&#xff08;Java代码&#xff09;&#xff0c;定义实例工厂&#xff08;xml&#xff09;&#xff0c;定义调用实例工厂&#xff…...

AI编程--插件对比分析:CodeRider、GitHub Copilot及其他

AI编程插件对比分析&#xff1a;CodeRider、GitHub Copilot及其他 随着人工智能技术的快速发展&#xff0c;AI编程插件已成为提升开发者生产力的重要工具。CodeRider和GitHub Copilot作为市场上的领先者&#xff0c;分别以其独特的特性和生态系统吸引了大量开发者。本文将从功…...

DeepSeek 技术赋能无人农场协同作业:用 AI 重构农田管理 “神经网”

目录 一、引言二、DeepSeek 技术大揭秘2.1 核心架构解析2.2 关键技术剖析 三、智能农业无人农场协同作业现状3.1 发展现状概述3.2 协同作业模式介绍 四、DeepSeek 的 “农场奇妙游”4.1 数据处理与分析4.2 作物生长监测与预测4.3 病虫害防治4.4 农机协同作业调度 五、实际案例大…...

算法:模拟

1.替换所有的问号 1576. 替换所有的问号 - 力扣&#xff08;LeetCode&#xff09; ​遍历字符串​&#xff1a;通过外层循环逐一检查每个字符。​遇到 ? 时处理​&#xff1a; 内层循环遍历小写字母&#xff08;a 到 z&#xff09;。对每个字母检查是否满足&#xff1a; ​与…...

安全突围:重塑内生安全体系:齐向东在2025年BCS大会的演讲

文章目录 前言第一部分&#xff1a;体系力量是突围之钥第一重困境是体系思想落地不畅。第二重困境是大小体系融合瓶颈。第三重困境是“小体系”运营梗阻。 第二部分&#xff1a;体系矛盾是突围之障一是数据孤岛的障碍。二是投入不足的障碍。三是新旧兼容难的障碍。 第三部分&am…...

纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join

纯 Java 项目&#xff08;非 SpringBoot&#xff09;集成 Mybatis-Plus 和 Mybatis-Plus-Join 1、依赖1.1、依赖版本1.2、pom.xml 2、代码2.1、SqlSession 构造器2.2、MybatisPlus代码生成器2.3、获取 config.yml 配置2.3.1、config.yml2.3.2、项目配置类 2.4、ftl 模板2.4.1、…...

腾讯云V3签名

想要接入腾讯云的Api&#xff0c;必然先按其文档计算出所要求的签名。 之前也调用过腾讯云的接口&#xff0c;但总是卡在签名这一步&#xff0c;最后放弃选择SDK&#xff0c;这次终于自己代码实现。 可能腾讯云翻新了接口文档&#xff0c;现在阅读起来&#xff0c;清晰了很多&…...

【LeetCode】3309. 连接二进制表示可形成的最大数值(递归|回溯|位运算)

LeetCode 3309. 连接二进制表示可形成的最大数值&#xff08;中等&#xff09; 题目描述解题思路Java代码 题目描述 题目链接&#xff1a;LeetCode 3309. 连接二进制表示可形成的最大数值&#xff08;中等&#xff09; 给你一个长度为 3 的整数数组 nums。 现以某种顺序 连接…...