Python:将图像发送到 Flask API 以存储在服务器上以供进一步使用

dst*_*ner 3 python flask

我正在尝试将图像发送到 Flask API。到目前为止,我正在使用 base64 对要作为字符串发送的图像进行编码。在服务器端,我接收该字符串并对其进行解码,并尝试在服务器端写入文件。代码运行,但生成的 JPG 不可见,并且显示“看起来我们不支持这种格式”。我还尝试将文件另存为其他照片文件格式。我将它转换为字符串,这就是我保存为 jpg 的原因。

这是我的客户端代码:

with open(filename, "rb") as img:
    string = base64.b64encode(img.read())

print(type(string))
print(string)

name = 'John Doe'
EmpID = 1
company = 1

def test():
    api_url = "http://192.168.8.13:5000/register-new?emp_name=%s&company_id=%s&emp_id=%s&user_photo=%s" % (name, company, EmpID, string)
    response = requests.post(url= api_url)
    assert response.status_code == 200
Run Code Online (Sandbox Code Playgroud)

这是接收照片的服务器端代码。

photo = request.args.get('user_photo')
    photo1 = photo.replace(" ", "")
    f = (base64.b64decode(photo1))
    a = io.BytesIO()
    with open("compare.jpg", "wb") as file:
        file.write(f)
Run Code Online (Sandbox Code Playgroud)

v25*_*v25 5

如果您确实想将其作为 base64 数据上传,我建议将其作为 JSON 放在帖子正文中,而不是作为 GET 参数。

在客户端,像这样打开文件:

with open(filename, "rb") as img:
    string = base64.b64encode(img.read()).decode('utf-8')
Run Code Online (Sandbox Code Playgroud)

然后在您的test函数中,image_data从 URL 中取出该字符串,并使用request.post参数json以正确的内容类型传递该字符串。您可以考虑通过将其他变量添加到使用此参数传递的字典来发送它们:

def test():
    api_url = "http://192.168.8.13:5000/register-new?emp_name=%s&company_id=%s&emp_id=%s" % (name, company, EmpID)
    response = requests.post(url= api_url, json={'user_photo':string})
Run Code Online (Sandbox Code Playgroud)

然后在后端,用 Flask 的request.get_json函数获取它并初始化该BytesIO对象,然后将数据写入该对象,最后写入文件:

@app.route('/register-new', methods=['POST'])
def register_new():
    photo = request.get_json()['user_photo']
    
    photo_data = base64.b64decode(photo)
    
    with open("compare.jpg", "wb") as file:
        file.write(photo_data)
Run Code Online (Sandbox Code Playgroud)

通过测试图像,它可以正常工作,正如 Linuxfile命令所确认的:

$ file compare.jpg
compare.jpg: JPEG image data, baseline, precision 8, 500x750, components 3
Run Code Online (Sandbox Code Playgroud)