将图像编码/解码为 base64 flask&python



我有一个名为"image.png"的图像,首先我向服务器请求将图像保存为json文件中的base64字符串。

def get_img_content(coding='utf-8'):
with open('image.png', 'rb') as f:
img_data = base64.b64encode(f.read()).decode(coding)
return img_data
requests.get(f'http://127.0.0.1:5000/?face={get_img_content()}')

Bellow我已经添加了服务器的代码来处理我的请求

from flask import Flask, request
import os
import json
app = Flask(__name__)
if "data.json" not in os.listdir(os.getcwd()):
with open('data.json', 'a', encoding='utf-8') as f:
pass
content = {'ids': [], 'results': []}
else:
with open('data.json', 'r', encoding='utf-8') as f:
content = json.loads(f.read())
def add_id(id, face, content=content):
content['ids'].append({id: face})
with open('data.json', 'w', encoding='utf-8') as f:
f.write(json.dumps(content))
@app.route('/', methods=['GET'])
def main():
face = request.args.get('face')
if not face:
return 'Valid request has to contain face'
id = [int(list(i.keys())[0]) for i in content['ids']]
id = str(max(id) + 1 if id else 1)
add_id(id, face)
print(content)
return id

@app.route('/get', methods=['GET'])
def get():
id = request.args.get('id')
if not id:
return 'Valid request has to contain id'
for i in content['results']:
if list(i.keys())[0] == id:
return json.dumps({'result': i[id]})
return "Couldn't find result"

if __name__ == '__main__':
app.run()

在那之后,我试图从data.json中读取这个base64字符串并将其转换为图像,但我得到了PaddingError
binascii.Error:不正确的填充

import base64
import json
with open('data.json', 'r', encoding='utf-8') as f:
content = json.loads(f.read())

def to_image():
with open('image.png', 'wb') as f:
f.write(base64.b64decode(list(content['ids'][0].items())[-1][-1].encode('utf-8')))

to_image()

请帮我复制我的步骤,不要出现这个错误。

简介

每种格式都有(应该有(它们自己的";标题";以及";结束";信号以便知道:

  1. 它包含什么类型的信息
  2. 数据从哪里开始
  3. 它在哪里结束

参见";标题";以及";结束";这里的.jpg文件结构:jpg签名格式:文档&回收示例

为什么会存在?它阻止了这里发生的事情。。。应该有一个";隐藏的";检查";标题";以及";结束";字节是正确的,如果不正确,那么数据就丢失了。然后用提醒您

二进制错误:填充不正确

调试

您在data.json中写入的字节数组比图像中的原始字节数组小得多。。。你正在丢失信息。

观察

我所看到的和我认为的问题是,你正在用HTTP动词GET发送大量数据。它的限制容量为8KB。然后,如果您的图像比这个大,您就不能用GET请求发送它。

请参阅此处的限制:HTTP GET请求的最大长度

推荐

对于这种情况,使用POST请求发送大于8KB的数据(*POST请求的使用不仅限于大小,还有其他情况(

解决方案

有多种方法可以通过POST请求发送,请参阅此处:MIME类型。

发送:

  1. 一个图像,使用MIME类型image
  2. 使用multipart/form-data的多个文件
  3. 您可以使用application/json发送JSON
  4. 使用text/plain发送原始文本

请参阅:如何在HTTP POST请求中发送参数?

图像:图像或图形数据,包括位图和矢量静态图像以及静态图像格式的动画版本,如动画GIF或APNG。常见的例子有image/jpeg、image/png和image/svg+xml。

您可以通过这种方式获取数据(我认为,这只适用于多个文件multipart/form-data(:

face=request.files['face'].read()

也许其他是:

request.form['face']
request.data['face']
request.get_data['face']
request.get_json['face']

以下是从POST请求接收数据的正确和不同方法:获取在Flask请求中接收的数据

请参阅附加:Flask HTTP方法,handle GET&POST请求

最新更新