Niepoprawny typ URL przy odczytaniu obrazu enkodowanego Base64

0

Cześć. Stawiam Api w flask, które ma za zadanie odebrać URI obrazu w formacie data:image/jpeg;base64, następnie przekonwertować go tak, żeby mogło go odczytać cv2 i przetworzyć. Jednak utknąłem w martwym punkcie. Mianowicie mam kod:

app = Flask(__name__)

@app.route('/api/test', methods=['POST'])
def test():
    request_image_data = request.data
    resp = urllib.request.urlopen(request_image_data)
    image = np.asarray(bytearray(resp.read()), dtype="uint8")
    image = cv2.imdecode(image, cv2.IMREAD_COLOR)
    return 'OK'

app.run()

i kiedy z PostMan-a wysyłam POST na odpowiedni adres, w postmanie pokazuje się 500 Internal Server Error, a w konsoli:

[2022-10-15 12:06:29,761] ERROR in app: Exception on /api/test [POST]
Traceback (most recent call last):
  File "C:\Users\Victor\AppData\Local\Programs\Python\Python310\lib\site-packages\flask\app.py", line 2525, in wsgi_app
    response = self.full_dispatch_request()
  File "C:\Users\Victor\AppData\Local\Programs\Python\Python310\lib\site-packages\flask\app.py", line 1822, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "C:\Users\Victor\AppData\Local\Programs\Python\Python310\lib\site-packages\flask\app.py", line 1820, in full_dispatch_request
    rv = self.dispatch_request()
  File "C:\Users\Victor\AppData\Local\Programs\Python\Python310\lib\site-packages\flask\app.py", line 1796, in dispatch_request
    return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args)
  File "c:\Users\Victor\Desktop\face\server\server.py", line 15, in test
    resp = urllib.request.urlopen(request_image_data.decode('ASCII'))
  File "C:\Users\Victor\AppData\Local\Programs\Python\Python310\lib\urllib\request.py", line 216, in urlopen
    return opener.open(url, data, timeout)
  File "C:\Users\Victor\AppData\Local\Programs\Python\Python310\lib\urllib\request.py", line 519, in open
    response = self._open(req, data)
  File "C:\Users\Victor\AppData\Local\Programs\Python\Python310\lib\urllib\request.py", line 541, in _open
    return self._call_chain(self.handle_open, 'unknown',
  File "C:\Users\Victor\AppData\Local\Programs\Python\Python310\lib\urllib\request.py", line 496, in _call_chain
    result = func(*args)
  File "C:\Users\Victor\AppData\Local\Programs\Python\Python310\lib\urllib\request.py", line 1419, in unknown_open
    raise URLError('unknown url type: %s' % type)
urllib.error.URLError: <urlopen error unknown url type: {
    "data">
127.0.0.1 - - [15/Oct/2022 12:06:29] "POST /api/test HTTP/1.1" 500 -

Nie mam pojęcia jak sobie z tym poradzić.

0

Ten twój parametr request_image_data wydaje się nie być poprawnie przekazany

>>> urllib.request.urlopen('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAIAAAACUFjqAAABhGlDQ1BJQ0MgcHJvZmlsZQAAKJF9kT1Iw0AcxV/TSqVWOthBxCFDdbIgKuKoVShChVArtOpgcv2EJg1Jiouj4Fpw8GOx6uDirKuDqyAIfoA4OjkpukiJ/0sKLWI8OO7Hu3uPu3eA0Kwy1QyMA6pmGelkQszmVsXgK0KIoA8BhGRm6nOSlILn+LqHj693cZ7lfe7P0Z8vmAzwicSzTDcs4g3i6U1L57xPHGVlOU98Tjxm0AWJH7muuPzGueSwwDOjRiY9TxwlFktdrHQxKxsq8RRxLK9qlC9kXc5z3uKsVuusfU/+wnBBW1nmOs1hJLGIJUgQoaCOCqqwEKdVI8VEmvYTHv4hxy+RSyFXBYwcC6hBhez4wf/gd7dmcXLCTQongJ4X2/4YAYK7QKth29/Htt06AfzPwJXW8deawMwn6Y2OFjsCItvAxXVHU/aAyx1g8EmXDdmR/DSFYhF4P6NvygEDt0Boze2tvY/TByBDXaVugINDYLRE2ese7+7t7u3fM+3+fgDsZnJxQToB4gAAAAlwSFlzAAAuIwAALiMBeKU/dgAAAAd0SU1FB+YKDwsENFeXhJgAAAAZdEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVBXgQ4XAAAAtUlEQVQY022PsQqDMBCGzygSudhFSg9xEDKEPkOftQ/T3bGL0gx1kEAHhxooiUgHwVrbf7vv4477g7NS8C9Kylprhoi/LieapklJyQqinGjtEDFFjMKQBUF4YiwVIj8cXs557wFgn2XO+x3itWkiAOiMQcSCSHB+NyZFfFr76HsAYPNBa22ttUiSY1kKzjtjOmM+es6lqvw4unFcSLR5qh+GWuuFfG1ba3kcrwnbNL61rZJyGd9ln0Ah6lSuYAAAAABJRU5ErkJggg==')
<addinfourl at 140379095206160 whose fp = <_io.BytesIO object at 0x7fac8e1aa6d0>>
>>>
>>> # zauważ {\n" na początku stringa
>>> urllib.request.urlopen('{\n"data":image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAIAAAACUFjqAAABhGlDQ1BJQ0MgcHJvZmlsZQAAKJF9kT1Iw0AcxV/TSqVWOthBxCFDdbIgKuKoVShChVArtOpgcv2EJg1Jiouj4Fpw8GOx6uDirKuDqyAIfoA4OjkpukiJ/0sKLWI8OO7Hu3uPu3eA0Kwy1QyMA6pmGelkQszmVsXgK0KIoA8BhGRm6nOSlILn+LqHj693cZ7lfe7P0Z8vmAzwicSzTDcs4g3i6U1L57xPHGVlOU98Tjxm0AWJH7muuPzGueSwwDOjRiY9TxwlFktdrHQxKxsq8RRxLK9qlC9kXc5z3uKsVuusfU/+wnBBW1nmOs1hJLGIJUgQoaCOCqqwEKdVI8VEmvYTHv4hxy+RSyFXBYwcC6hBhez4wf/gd7dmcXLCTQongJ4X2/4YAYK7QKth29/Htt06AfzPwJXW8deawMwn6Y2OFjsCItvAxXVHU/aAyx1g8EmXDdmR/DSFYhF4P6NvygEDt0Boze2tvY/TByBDXaVugINDYLRE2ese7+7t7u3fM+3+fgDsZnJxQToB4gAAAAlwSFlzAAAuIwAALiMBeKU/dgAAAAd0SU1FB+YKDwsENFeXhJgAAAAZdEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVBXgQ4XAAAAtUlEQVQY022PsQqDMBCGzygSudhFSg9xEDKEPkOftQ/T3bGL0gx1kEAHhxooiUgHwVrbf7vv4477g7NS8C9Kylprhoi/LieapklJyQqinGjtEDFFjMKQBUF4YiwVIj8cXs557wFgn2XO+x3itWkiAOiMQcSCSHB+NyZFfFr76HsAYPNBa22ttUiSY1kKzjtjOmM+es6lqvw4unFcSLR5qh+GWuuFfG1ba3kcrwnbNL61rZJyGd9ln0Ah6lSuYAAAAABJRU5ErkJggg==')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python3.9/urllib/request.py", line 214, in urlopen
    return opener.open(url, data, timeout)
  File "/usr/lib/python3.9/urllib/request.py", line 517, in open
    response = self._open(req, data)
  File "/usr/lib/python3.9/urllib/request.py", line 539, in _open
    return self._call_chain(self.handle_open, 'unknown',
  File "/usr/lib/python3.9/urllib/request.py", line 494, in _call_chain
    result = func(*args)
  File "/usr/lib/python3.9/urllib/request.py", line 1417, in unknown_open
    raise URLError('unknown url type: %s' % type)
urllib.error.URLError: <urlopen error unknown url type: {
"data">

0

Tak, odbierając z requesta dostaję na początku b', tutaj adres uri, a na końcu '. Zgaduję, że trzeba to jakoś parsować.

Użyłem .decode('UTF-8') i działa. Dziękuję za pomoc

1 użytkowników online, w tym zalogowanych: 0, gości: 1