图片及参数的发送及接收

Posted lishanlu136

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了图片及参数的发送及接收相关的知识,希望对你有一定的参考价值。

python可用来写后台程序,一般用flask写后台服务器的接口,当前端通过web页面发送图片及参数时,后台服务器接口会收到图片及参数;图片及参数不能直接以原来的形式在网络中传输,需要进行转换成二进制字符串的形式传输。下面介绍两种发送和对应接收的方式:

1、首先写上后台服务器接口,用于接收解码前端传过来的图片及参数,解码后的图片可以直接处理或保存。

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2021/09/02 19:08
# @Author  : lishanlu
# @File    : receve_samples.py
# @Software: PyCharm
# @Discription: 接收图片和参数的不同方式

from __future__ import absolute_import, print_function, division
from flask import Flask,request
import cv2
import json
import numpy as np
import base64

app = Flask(__name__)


@app.route("/recv_files", methods=['POST'])
def recv_files():
    data = request.form
    print("===== data:",data)
    f_obj = request.files.get('file', None)
    if f_obj is None:
        return json.dumps('status': 1, 'msg': 'No image was received.', 'result': [])
    content = f_obj.read()
    nparr = np.fromstring(content, np.uint8)
    img_np = cv2.imdecode(nparr, cv2.IMREAD_COLOR)
    cv2.imwrite('recv_files.jpg',img_np)
    print("======== img shape:",img_np.shape)
    return "ok"


@app.route("/recv_json", methods=['POST'])
def recv_json():
    data = request.data
    data = json.loads(data)
    name = data.get('name', 'no_recv')
    age = data.get('age', 'no_recv')
    print("======= recv args: ", name, str(age))
    image_string = data['img']
    img_data = base64.b64decode(image_string)
    nparr = np.fromstring(img_data, np.uint8)
    img_np = cv2.imdecode(nparr, cv2.IMREAD_COLOR)
    cv2.imwrite('recv_json.jpg', img_np)
    print("======== img shape:", img_np.shape)
    return "ok"


if __name__ == "__main__":
    app.run(host='0.0.0.0', port=3200)

服务通过3200端口监听前端传过来的请求,程序定义了两种接收方式,一种是把图片放在files中,参数放在form中;另一种是把图片和参数一起通过data传过来,但图片需要经过base64编码才能传,这边接收端也需要解码,才能用。

2、前端发送请求的方式:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2021/09/02 19:06
# @Author  : lishanlu
# @File    : post_request_samples.py
# @Software: PyCharm
# @Discription: 上传图片及参数的不同方式

from __future__ import absolute_import, print_function, division
import requests
import cv2
import base64


def img2b64(img):
    retval, buffer = cv2.imencode('.bmp', img)
    # buffer = img.tostring()
    pic_str = base64.b64encode(buffer)
    pic_str = pic_str.decode()
    return pic_str


def img2b64_f(path):
    fs = open(path,'rb')
    buffer = fs.read()
    fs.close()
    pic_str = base64.b64encode(buffer)
    pic_str = pic_str.decode()
    return pic_str


def post_files():
    files = 'file':open('./images/01.jpg','rb')
    data = 'name':'xyz','age':33
    r = requests.post('http://localhost:3200/recv_files', data=data, files=files)
    print('========== res:', r.text)


def post_json():
    path = './images/01.jpg'
    img = cv2.imread(path)
    pic_str = img2b64(img)
    data = 'img': pic_str, 'name': 'xyz', 'age':33
    r = requests.post('http://localhost:3200/recv_json', json=data)
    print('+++++++++ res:', r.text)


if __name__ == '__main__':
    #post_files()
    post_json()

以上是关于图片及参数的发送及接收的主要内容,如果未能解决你的问题,请参考以下文章

串口通信属性及事件解析

Qt开源作品40-图片及文字与base64编码互换

C++ SOCKET发送结构体及接收

CSS高级技巧,包括精灵图字体图标及常见布局技巧

手机端上传图片及java后台接收

Qt编写图片及视频TCP/UDP网络传输