用post请求发送压缩的numpy数组(zlib)到flask服务器 [python] 。

问题描述 投票:2回答:1

我想发送一个压缩的 numpy 数组(用 zlib)到flask服务器的post请求,但压缩的字节对象在服务器端被改变。如何正确发送字节对象与 requests 帖子请求,这样我就可以在服务器端解压了?

server.py

from flask import Flask
from flask_restful import Resource, Api, reqparse
import json
import numpy as np
import base64


# compression
import zlib

app = Flask(__name__)
api = Api(app)
parser = reqparse.RequestParser()
parser.add_argument('imgb64')

class Predict(Resource):
    def post(self):
        data = parser.parse_args()
        if data['imgb64'] == "":
            return {
                    'data':'',
                    'message':'No file found',
                    'status':'error'
                    }

        img = data['imgb64']

        print('rec')

        # decompress
        print(type(img))
        print(img)

        dec = zlib.decompress(img) # this gives me error



        if img:
            pass

            return json.dumps({
                    'data': 'done', 
                    'message':'darknet processed',
                    'status':'success'
                    })
        return {
                'data':'',
                'message':'Something when wrong',
                'status':'error'
                }


api.add_resource(Predict,'/predict')

if __name__ == '__main__':
    app.run(debug=True, host = '0.0.0.0', port = 5000, threaded=True)

客户端.py

import numpy as np 
import base64
import zlib
import requests

frame = np.random.randint(0,255,(5,5,3)) # dummy rgb image
# compress

data = zlib.compress(frame)
print('b64 encoded')
print(data)
print(len(data))
print(type(data))

r = requests.post("http://127.0.0.1:5000/predict", data={'imgb64' : data}) # sending compressed numpy array

这给了我以下错误。

TypeError: a bytes-like object is required, not 'str'

所以,我试图将字符串转换为 bytes 对象。

dec = zlib.decompress(img.encode()) # this gives me error

但是,这个也给我一个错误。

zlib.error: Error -3 while decompressing data: incorrect header check

我试过其他编码,也失败了.

我注意到一件事,当我在客户端打印压缩的字节时,它的读数是。

b'x\x9c-\xcf?J\x82q\x00\x06\xe0\x0ftrVP\\C\xf4\x06\x9268\t\xcdR\x8ej.F\xa0\xe0\xd0\xa6\xa3\xe0V\x07\x10\x1cL\xc8\xd1\x03\xd4\xe4\t\x0c\x12\x84\xb6D\x0c#\xbc\x80O\xf0\x1b\x9e\xf5\xfdS\x89\xa2h\xcf\x9a\x03\xef\xc4\xf8cF\x92\r\xbf4i\x11g\xc83\x0f\x8c\xb9\xa2@\x8e\x1bn\xd91g\xc0\x91%\xd7\xdc\xf3M\x83<i:L\xa8\xf1\x19\xfa\xffw\xfd\xf0\xc5\x94:O\x9cH\x85\xcc6#\x1e\xc3\xf6\x05\xe5\xa0\xc7\x96\x04]J\\\x90\xa1\x1f~Ty\xe1\x8d\x15w|P\xe4\x95K\xb2!\xe3\x0cw)%I'

但在服务器端,接收到的字符串是完全不同的。

�4ig�3���@�n�1g��%���M�<i:L����w��Ŕ:O�H��6#���ǖ]J\��~Ty�w|P�K�!�w)%I

我也尝试过用字符串的方式发送,通过...

r = requests.post("http://127.0.0.1:5000/predict", data={'imgb64' : str(data)})

但是,我无法在服务器端解压数据。

python-3.x flask zlib
1个回答
0
投票

看来,我不能发送 zlib 直接压缩字节,所以我用base64将数据编码成了 ascii 字符串。

所以,总之这对我来说是有效的。numpy arrayany non-string data -> zlib compression -> base64 encode -> post request -> flask -> base64 decode -> zlib decompress。

客户端.py

import numpy as np 
import base64
import zlib
import requests

frame = np.random.randint(0,255,(5,5,3)) # dummy rgb image

# compress

data = zlib.compress(frame)

data = base64.b64encode(data)


data_send = data

data2 = base64.b64decode(data)

data2 = zlib.decompress(data2)


fdata = np.frombuffer(data2, dtype=np.uint8)

print(fdata)


r = requests.post("http://127.0.0.1:5000/predict", data={'imgb64' : data_send})

服务器.py

from flask import Flask
from flask_restful import Resource, Api, reqparse
import json
import numpy as np
import base64


# compression
import zlib
import codecs


app = Flask(__name__)
api = Api(app)
parser = reqparse.RequestParser()
parser.add_argument('imgb64', help = 'type error')

class Predict(Resource):
    def post(self):
        data = parser.parse_args()
        #print(data)
        if data['imgb64'] == "":
            return {
                    'data':'',
                    'message':'No file found',
                    'status':'error'
                    }

        #img = open(data['imgb64'], 'r').read() # doesn't work
        img = data['imgb64']


        data2 = img.encode()
        data2 = base64.b64decode(data2)

        data2 = zlib.decompress(data2)

        fdata = np.frombuffer(data2, dtype=np.uint8)

        print(fdata)

        if img:

            return json.dumps({
                    'data': 'done', 
                    'message':'darknet processed',
                    'status':'success'
                    })
        return {
                'data':'',
                'message':'Something when wrong',
                'status':'error'
                }


api.add_resource(Predict,'/predict')

if __name__ == '__main__':
    app.run(debug=True, host = '0.0.0.0', port = 5000, threaded=True)
© www.soinside.com 2019 - 2024. All rights reserved.