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

使用Multipart Form-Data一次请求获取多张图片

文章目录

      • 一、Multipart Form-Data 的优点
      • 二、代码实现
        • 1、Flask后端代码
        • 2、Android客户端代码
        • 3、代码说明
        • 4、注意事项


一、Multipart Form-Data 的优点

  1. 支持文件上传

    • 文件支持Multipart Form-Data 是唯一一种可以用于上传文件的 HTTP 数据格式。它允许将文件内容作为二进制数据直接嵌入到请求体中。
    • 多种文件类型:可以同时上传多种类型的文件(如图片、文档、视频等),并且可以指定每个文件的 MIME 类型。
    • 文件元数据:除了文件内容,还可以包含文件的元数据(如文件名、文件大小等)。
  2. 支持混合数据类型

    • 表单字段和文件混合Multipart Form-Data 允许在一个请求中同时发送普通文本字段和文件字段。这对于复杂的表单提交非常有用,例如用户注册时上传头像和填写个人信息。
    • 灵活的数据结构:可以将不同类型的数据(如文本、文件、JSON 等)封装在同一个请求中,每个部分(part)都有自己的头部和内容。
  3. 分段传输

    • 分段结构:数据被分割成多个部分(parts),每个部分都有一个分隔符(boundary)。这种结构使得数据的解析更加清晰和灵活。
    • 易于扩展:可以轻松添加或删除部分,而不会影响其他部分的内容。
  4. 兼容性强

    • 广泛支持Multipart Form-Data 是 HTTP 协议的标准格式,几乎所有现代的 Web 浏览器和 HTTP 客户端(如 OkHttp、Postman 等)都支持这种格式。
    • 跨语言支持:无论是前端(HTML 表单、JavaScript)还是后端(Flask、Django、Spring Boot 等),都可以轻松处理 Multipart Form-Data 格式的数据。
  5. 安全性

    • 文件隔离:每个文件被封装在一个独立的部分中,文件内容和元数据被清晰地分隔,减少了数据混淆的风险。
    • 内容类型检查:可以为每个部分指定 MIME 类型,服务器可以验证文件类型,从而提高安全性。

二、代码实现

Multipart Form-Data实现客户端(如Android应用)一次请求从Flask服务器获取多张图片

1、Flask后端代码

在Flask后端,可以使用flask.send_file或直接构造一个Multipart Form-Data响应来发送多张图片。

如果需要发送多张图片,可以通过构造一个Multipart Form-Data响应来实现:

from flask import Flask, request, jsonify, Response
import osapp = Flask(__name__)@app.route('/request_images', methods=['POST'])
def request_images():try:# 获取客户端发送的图片文件名列表image_names = request.form.getlist('image_names')if not image_names:return jsonify({"error": "No image names provided"}), 400# 定义分隔符boundary = 'my_boundary'response_body = []for image_name in image_names:# 构造图片文件路径image_path = os.path.join('path/to/images', image_name)if os.path.exists(image_path):# 打开图片文件with open(image_path, 'rb') as f:image_data = f.read()# 构造Multipart Form-Data格式response_body.append(f'--{boundary}\r\n'.encode('utf-8'))response_body.append(f'Content-Disposition: form-data; name="file"; filename="{image_name}"\r\n'.encode('utf-8'))response_body.append('Content-Type: image/jpeg\r\n\r\n'.encode('utf-8'))response_body.append(image_data)response_body.append(b'\r\n')else:# 如果文件不存在,记录错误信息print(f"File not found: {image_path}")# 添加结束标记response_body.append(f'--{boundary}--\r\n'.encode('utf-8'))# 将响应体拼接为一个完整的字节串response_body = b''.join(response_body)# 返回响应return Response(response_body, mimetype=f'multipart/form-data; boundary={boundary}')except Exception as e:# 捕获其他异常return jsonify({"error": str(e)}), 500if __name__ == '__main__':app.run(debug=True)
2、Android客户端代码

在Android客户端,使用OkHttp库请求多张图片。由于服务器返回的是Multipart Form-Data格式,客户端需要解析这个格式来提取每张图片。

import okhttp3.*;
import android.util.Log;import java.io.IOException;public class ImageRequester {private OkHttpClient client = new OkHttpClient();private static final String TAG = "ImageRequester"; // 日志标签public void requestImages(String... imageNames) {// 创建MultipartBody.BuilderMultipartBody.Builder builder = new MultipartBody.Builder().setType(MultipartBody.FORM);// 添加每个图片文件名到请求体for (String imageName : imageNames) {builder.addFormDataPart("image_names", imageName);}// 构造请求体RequestBody requestBody = builder.build();// 构造POST请求Request request = new Request.Builder().url("http://your-flask-server-url/request_images") // 替换为Flask服务器的URL.post(requestBody).build();// 发送请求并获取响应client.newCall(request).enqueue(new Callback() {@Overridepublic void onFailure(Call call, IOException e) {// 网络请求失败Log.e(TAG, "Network request failed: " + e.getMessage(), e);}@Overridepublic void onResponse(Call call, Response response) throws IOException {if (!response.isSuccessful()) {// 服务器返回错误响应Log.e(TAG, "Server returned an error: " + response.code() + " " + response.message());return;}// 处理服务器返回的图片数据byte[] responseData = response.body().bytes();try {processResponseData(responseData);} catch (Exception e) {// 解析响应失败Log.e(TAG, "Failed to parse response data: " + e.getMessage(), e);}}});}private void processResponseData(byte[] responseData) {// 解析Multipart Form-Data格式并处理图片// 示例:保存图片到文件或显示到界面上// 这里需要根据实际情况实现解析逻辑}
}
3、代码说明
  1. 客户端(Android)

    • 使用MultipartBody.Builder构造请求体,将图片文件名作为表单字段发送。
    • 发送POST请求到服务器。
    • 接收服务器返回的响应数据,并解析Multipart Form-Data格式以提取图片内容。
  2. 服务器(Flask)

    • 使用request.form.getlist获取客户端发送的图片文件名列表。
    • 遍历文件名列表,读取对应的图片文件内容。
    • 使用Multipart Form-Data格式构造响应体,将每张图片作为一个部分(part)添加到响应中。
    • 返回响应给客户端。
4、注意事项
  1. 文件路径

    • 确保服务器上的图片路径正确,且图片文件存在。
    • 客户端发送的文件名应与服务器上的文件名一致。
  2. 内容类型

    • 在构造响应时,根据图片的实际格式设置正确的Content-Type(如image/jpegimage/png等)。

相关文章:

  • 真我推出首款 AI 翻译耳机,支持 32 种语言翻译
  • 2.5 函数的拓展
  • LangGraph(二)——QuickStart样例中的第二步
  • C++ std::forward 详解
  • 【源码】【Java并发】【ThreadLocal】适合中学者体质的ThreadLocal源码阅读
  • 在 40 亿整数中捕获“恰好出现两次”的数字
  • 动态提示词(小模型)、RAG和提示词系统
  • 【CPP】固定大小内存池
  • 蓝牙 6.0 发布,解锁无线科技新可能
  • 【TeamFlow】4.3.2 细化时间单位
  • ISO15189认证有什么要求?ISO15189认证流程
  • 15.三数之和(LeetCode)java
  • 数据集 | 柑橘果目标检测数据集
  • 云原生--CNCF-1-云原生计算基金会介绍(云原生生态的发展目标和未来)
  • Oracle--SQL事务操作与管理流程
  • Vue2-样式相关
  • 【高并发内存池】从零到一的项目之高并发内存池整体框架设计及thread cache设计
  • 基于TCP的协议
  • 深度学习--卷积神经网络保存最优模型
  • mcp 客户端sse远程调用服务端与本地大模型集成实例
  • 对话地铁读书人|媒体人Echo:读书使人远离“班味”
  • 研讨会|中国古代石刻与历史研究的多重图景
  • “低头捡星光”,艺术创作直面三江源生态保护
  • 巴基斯坦航天员选拔工作正在进行,1人将以载荷专家身份参加联合飞行
  • 41岁知名学者陈昊因病骤然离世,北大再发讣告缅怀
  • 山东省淄博市委原常委宋振波被“双开”