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

使用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等)。
http://www.xdnf.cn/news/1307.html

相关文章:

  • Linux网络IP协议
  • 【ROS2】ROS2 插件开发流程(基于 pluginlib)
  • 2023蓝帽杯初赛内存取证-4
  • 数据结构-树
  • 美乐迪电玩客户端打包与资源替换实战教程
  • Shader属性讲解+Cg语言讲解
  • pda数据采集器,是如何采集数据的?
  • Docker底层原理浅析 | namespace+cgroups+文件系统
  • windows搭建xwiki17服务器
  • C++——多态、抽象类和接口
  • 鸿道操作系统Type 1虚拟化:破局AI机器人与智能汽车的“安全”与“算力”双刃剑
  • cloudflare配置邮件路由,实现多邮箱接收邮件
  • Web内网渗透知识大全
  • 剑指Offer(数据结构与算法面试题精讲)C++版——day18
  • 随机数算法原理以及模拟实现
  • QtCreator 调试 Linux 内核详细步骤指南
  • 多轮Function Calling的最佳实践
  • 解决找不到字体的问题
  • org.springframework.beans.factory.config.YamlPropertiesFactoryBean 类详解
  • Java函数生成实际应用案例:数据处理流水线
  • 代理设计模式:从底层原理到源代码 详解
  • RT-Thread学习笔记(三)
  • 从零开始学java--二叉树和哈希表
  • 工作中sql总结
  • 无需复杂操作即可锁定键鼠的工具
  • [大模型]什么是function calling?
  • Linux操作系统--进程程序替换and做一个简单的shell
  • 3.6/Q1,Charls数据库经典文章解读
  • 【第九章 Python学习之函数Ⅱ】
  • 监控页面卡顿PerformanceObserver