flask 接口处理带有图片和json数据的请求 发送图片到前端的实现

news2024/11/26 19:29:54

1.flask的request

从flask的源码可以看到flask的可用属性很多,包括data,form,files,header,host等,在我们接收文件传参时需要用到的属性就是form和files。不过具体的使用方式有两种,即:postman发送的和requests模拟发送的。

2.通过postman 模拟发送图片的解决方案

在这里插入图片描述
如图所示,在headers中设置Content-Type 为multipart/form-data
在body中设置key和value
在这里插入图片描述
其中 文件的选择是通过点击select files进行选择的,这样从flask端接收文件时的代码如下:

@camunda_power_bp.route('/repair/receipt/', methods=['POST'])
@format_func.json_none_blank
def repair_receipt():
    data = request.form.to_dict()
    print(data,type(data))
    if not isinstance(data,dict):
        try:
            data = json.loads(data)
        except Exception as e:
            print(e)
            message = {"code":1,"message":"参数不是json"}
            return json.dumps(message,ensure_ascii=False)
    print(request.form)
    #data = json.loads(data)
    images = request.files
    # print(request.files)
    if images:
        #image_addr_list = image_func.image_save(images,request)
        image_addr_list = image_func.image_save_form("file_imgs",request)
        print(image_addr_list)
    else:
        image_addr_list = []

代码中的request.form.to_dict()是用于接收form数据的,把postman的form字段进行转化成为字典,文件的接收则是通过request.files的方式。
对请求中的所有文件进行轮询的函数时image_save_form,如下:

import os, sys

path1 = os.path.dirname(os.path.abspath(__file__))
path2 = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
sys.path.append(path2)
sys.path.append(path1)

UPLOAD_PATH = os.path.join(path2, 'images')
from werkzeug.utils import secure_filename
def image_save_form(keyname,request):
    image_addr = []
    imgs = request.files.getlist(keyname)
    print(imgs)
    for img in imgs:
        filename = secure_filename(img.filename)
        print(filename)
        img.save(os.path.join(UPLOAD_PATH, filename))
        image_addr.append(os.path.join(UPLOAD_PATH, filename))
    return image_addr

按照以上方式将文件进行了保存。

3.通过requests模拟发送图片的解决方案

requests程序如下:

import requests
def path_file():
    folder_path = os.path.join(path2, "images")
    # 使用os.listdir()获取文件夹下的所有文件和子文件夹名
    all_items = os.listdir(folder_path)
    # print(all_items)
    # 使用os.path.isfile()筛选出文件名
    file_names = [item for item in all_items if os.path.isfile(os.path.join(folder_path, item))]
    number = 1
    files = []
    for image_name in file_names:
        #image_name = os.path.basename(image)
        image_name_type = image_name.split(".")[-1]
        image_info = ("file"+str(number),(image_name,open(os.path.join(folder_path,image_name),'rb'),"image/"+image_name_type))
        number += 1
        files.append(image_info)
    #print(files)
    return files
    
def repair_recipt_image(proc_inst_id_list,assignee):
    """
    待开发:
    :return:
    """
    url = ip_addr + "/task/getdetail/imformation/"
    url2 = ip_addr + "/repair/receipt/"
        power_monitor = department_monitor("供配电")
        print(power_monitor)
        request_data = { "complete_status": "楚王好细腰",
                        "abnormality_situation": "宫中多饿死"}
        files = path_file()
        response_data = requests.post(url2, files=files,data=request_data)
        print(response_data.json())

通过以上代码可以获取到文件夹下的所有文件,并且把绝对路径加入到request的files中,通过data加入要传入的json参数。
对应的 flask的代码也需要修改,因为requests发送多个图片时只能用以上的方式添加,即:
[(filename,filepath,filetype),(filename,filepath,filetype)]在元组内说明文件名,路径,类型,但是这样的话就无法通过键来遍历所有图,所以我就只能通过遍历的方式进行设置了。不过遍历所有文件的方式对于postman发来的所有文件又处理不了,只能找到其发来的第一个文件,所以就只能用两种方式来进行写代码了。

@camunda_power_bp.route('/repair/receipt/', methods=['POST'])
@format_func.json_none_blank
def repair_receipt():
    data = request.form.to_dict()
    print(data,type(data))
    if not isinstance(data,dict):
        try:
            data = json.loads(data)
        except Exception as e:
            print(e)
            message = {"code":1,"message":"参数不是json"}
            return json.dumps(message,ensure_ascii=False)
    print(request.form)
    #data = json.loads(data)
    images = request.files
    # print(request.files)
    if images:
        image_addr_list = image_func.image_save(images,request)
        #image_addr_list = image_func.image_save_form("file_imgs",request)
        print(image_addr_list)
    else:
        image_addr_list = []

def image_save(images, request):

    image_addr = []
    for img_name in images:
        # file_list.append(img)
        imgs = request.files.getlist(img_name)
        for img in imgs:
            filename = secure_filename(img.filename)
            print(filename)
            img.save(os.path.join(UPLOAD_PATH, filename))
            image_addr.append(os.path.join(UPLOAD_PATH, filename))

    return image_addr

经过这样的操作,可以对文件和json进行获取。实际使用中,前端使用vue发出的文件请求也是使用本节的方法进行接收的。

4.postgresql保存图片格式数据

在 PostgreSQL 中,你可以使用 bytea 数据类型来存储图片。bytea 是一种用于存储二进制数据的类型,非常适合用于存储图片、音频和视频等文件。

以下是在 PostgreSQL 中存储图片的一般步骤:

创建一个包含 bytea 类型列的表:

CREATE TABLE images (  
  id SERIAL PRIMARY KEY,  
  image_name VARCHAR(255),  
  image_data BYTEA  
);

将图片文件转换为二进制格式:
你可以使用任何编程语言将图片文件转换为二进制格式。例如,在 Python 中,你可以使用以下代码将图片文件转换为二进制格式:

with open('image.jpg', 'rb') as file:  
    binary_data = file.read()

将二进制数据插入到 bytea 列中:
使用 SQL 语句将二进制数据插入到 bytea 列中。例如,在 Python 中,你可以使用以下代码将二进制数据插入到 PostgreSQL 数据库中:

import psycopg2  
  
conn = psycopg2.connect(database="your_database", user="your_username", password="your_password", host="localhost", port="5432")  
cur = conn.cursor()  
with open('image.jpg', 'rb') as file:  
   binary_data = file.read()
cur.execute("INSERT INTO images (image_name, image_data) VALUES (%s, %s)", ('image.jpg', binary_data))  
conn.commit()  
cur.close()  
conn.close()

请注意,上述代码仅提供了一个示例,你需要根据你的实际情况进行修改。确保将 your_database、your_username、your_password、localhost 和 5432 替换为你的实际数据库连接信息。
不过实际使用中,这样的insert还是只能这样用,当我定义sql=“INSERT INTO images (image_name, image_data) VALUES (%s, %s)”, (‘image.jpg’, binary_data) 后执行cur.execute(sql)时就出现问题了。同理线程池中也是这样的问题,具体原因有待查询。

参考文献:
postman模拟发送图片:

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

〖大前端 - 基础入门三大核心之JS篇(57)〗- 继承

说明:该文属于 大前端全栈架构白宝书专栏,目前阶段免费,如需要项目实战或者是体系化资源,文末名片加V!作者:哈哥撩编程,十余年工作经验, 从事过全栈研发、产品经理等工作,目前在公司…

Leetcode—11.盛最多水的容器【中等】

2023每日刷题&#xff08;六十三&#xff09; Leetcode—11.盛最多水的容器 实现代码 #define MAX(a, b) ((a) > (b) ? (a) : (b)) #define MIN(a, b) ((a) < (b) ? (a) : (b)) int maxArea(int* height, int heightSize) {int left 0, right heightSize - 1;int m…

【具身智能评估7】ProcTHOR: Large-Scale Embodied AI Using Procedural Generation

论文标题&#xff1a;ProcTHOR: Large-Scale Embodied AI Using Procedural Generation 论文作者&#xff1a;Matt Deitke, Eli VanderBilt, Alvaro Herrasti, Luca Weihs, Jordi Salvador, Kiana Ehsani, Winson Han, Eric Kolve, Ali Farhadi, Aniruddha Kembhavi, Roozbeh M…

118. 杨辉三角

描述 : 给定一个非负整数 numRows&#xff0c;生成「杨辉三角」的前 numRows 行。 在「杨辉三角」中&#xff0c;每个数是它左上方和右上方的数的和。 题目 : LeetCode 118. 杨辉三角 : 118. 杨辉三角 分析 : 这道题用二维数组来做 . 解析 : class Solution {public Li…

python图像二值化处理

目录 1、双峰法 2、P参数法 3、迭代法 4、OTSU法 图像的二值化处理是将图像上的像素点的灰度值设置为0或255&#xff0c;也就是将整个图像呈现出明显的只有黑和白的视觉效果。二值化是图像分割的一种最简单的方法&#xff0c;可以把灰度图像转换成二值图像。具体实现是将大…

OpenSSL 3.2.0新增Argon2支持——防GPU暴力攻击

1. 引言 OpenSSL新发布的3.20版本中&#xff0c;引入了一些新特性&#xff0c;包括&#xff1a; post-quantum方法Brainpool曲线QUICArgon2&#xff1a;Argon2 是一种慢哈希函数&#xff0c;在 2015 年获得 Password Hashing Competition 冠军&#xff0c;利用大量内存计算抵…

Redis一些常用的技术

文章目录 第1关&#xff1a;Redis 事务与锁机制第2关&#xff1a;流水线第3关&#xff1a;发布订阅第4关&#xff1a;超时命令第5关&#xff1a;使用Lua语言 第1关&#xff1a;Redis 事务与锁机制 编程要求 根据提示&#xff0c;在右侧编辑器Begin-End补充代码&#xff0c;根据…

vuepress-----25、右侧目录

# 25、vuepress 右侧目录 https://github.com/xuek9900/vuepress-plugin-right-anchor vuepress-plugin-right-anchor English &#xff5c;中文 在用 Vuepress 2.x 编写的文档页面右侧添加 锚点导航栏 # 版本 2.x.x -> Vuepress 2.x -> npm next -> master 分支0…

c语言突击

一&#xff1a;前序 1.一个c语言程序有且只有一个main函数&#xff0c;是程序运行的起点&#xff01; 每个c语言程序写完后&#xff0c;都是先编译&#xff08;.c---&#xff09;&#xff0c;后链接&#xff08;.obj---&#xff09;&#xff0c;最后运行&#xff08;.exe&…

ROS-分布式通信

ROS是一个分布式计算环境。一个运行中的ROS系统可以包含分布在多台计算机上多个节点。根据系统的配置方式&#xff0c;任何节点可能随时需要与任何其他节点进行通信。 因此&#xff0c;ROS对网络配置有某些要求&#xff1a; 所有端口上的所有机器之间必须有完整的双向连接。每…

【VScode】设置语言为中文

1、下载安装好vscode 2、此时可看到页面为英文&#xff0c;为方便使用可切换为中文 3、键盘按下 ctrlshiftP 4、在输入框内输入configure display language 5、选择中文&#xff0c;restart即可&#xff08;首次会有install安装过程&#xff0c;等待安装成功后重启即可&am…

反爬虫介绍及其处理方法

反爬虫机制 封IP&#xff1a;监控短时间内同一地址的请求次数过大登录及验证码&#xff1a;对于监控后封IP之后短时间内继续的大量请求&#xff0c;要求登陆或验证码通过验证之后才能继续进行。健全账号体制&#xff1a;即核心数据只能通过账号登录后才能进行访问。动态加载数…

【.NET】控制台应用程序的各种交互玩法

关于控制台交互&#xff0c;大伙伴们也许见得最多的是进度条&#xff0c;就是输出一行但末尾不加 \n&#xff0c;而是用 \r 回到行首&#xff0c;然后输出新的内容&#xff0c;这样就做出进度条了。不过这种方法永远只能修改最后一行文本。 于是&#xff0c;有人想出了第二种方…

【MATLAB】数据拟合第12期-基于高斯核回归的拟合算法

有意向获取代码&#xff0c;请转文末观看代码获取方式~也可转原文链接获取~ 1 基本定义 基于高斯核回归的拟合算法是一种处理回归问题的机器学习方法。以下是该算法的简单介绍&#xff1a; 核心思想&#xff1a;高斯核回归的核心思想是利用高斯核函数对数据点进行非线性映射&a…

AudioGPT 语音技术全覆盖:语音识别、增强、分离、风格迁移等 | 开源日报 No.114

stevearc/oil.nvim Stars: 1.7k License: MIT oil.nvim 是一个类似于 vim-vinegar 的文件浏览器&#xff0c;允许您像普通 Neovim 缓冲区一样编辑文件系统。其主要功能包括支持常见插件管理器、通过适配器抽象进行所有文件系统交互以及提供 API 来执行各种操作。该项目的关键…

RNN梯度爆炸实验

前情回顾 from torch.utils.data import Dataset import torch.nn as nn import torch.nn.functional as F import os import random import torch from nndl import Accuracy from nndl import RunnerV3 from torch.utils.data import DataLoader import matplotlib.pyplot a…

零基础自学C语言|字符函数和字符串函数

在编程的过程中&#xff0c;我们经常要处理字符和字符串&#xff0c;为了方便操作字符和字符串&#xff0c;C语言标准库中提供了一系列库函数&#xff0c;接下来我们就学习一下这些函数。 &#x1f4cc;字符分类函数 C语言中有一系列的函数是专门做字符分类的&#xff0c;也就…

06_Web框架之Django三

Web框架之Django三 学习目标和内容 1、能够通过ORM模型创建数据表 2、能够通过ORM模型对数据进行操作 3、能够理解ORM模型对应关系 一、ORM概念 1、ORM介绍 对象关系映射 用于实现面向对象编程语言里不同类型系统数据之间的转换。 其就是使用面向对象的方式&#xff0c;操作…

风速预测(六)基于Pytorch的EMD-CNN-GRU并行模型

目录 前言 1 风速数据EMD分解与可视化 1.1 导入数据 1.2 EMD分解 2 数据集制作与预处理 2.1 先划分数据集&#xff0c;按照8&#xff1a;2划分训练集和测试集 2.2 设置滑动窗口大小为96&#xff0c;制作数据集 3 基于Pytorch的EMD-CNN-GRU并行模型预测 3.1 数据加载&a…

得帆信息创始人-张桐,受邀出席 BV百度风投AIGC主题论坛

近日&#xff0c;得帆信息创始人兼CEO张桐&#xff0c;作为百度风投被投代表企业创始人受邀出席“向未来&#xff0c;共成长” BV百度风投AIGC主题论坛。 与包括上海市徐汇区相关部门领导、百度集团相关事业部负责人及代表&#xff0c;以及来自国寿资本、中网投、麦顿投资的投资…