Не удается открыть декодированное в формате base64 изображение «.jpg» из-за отсутствия источника? - PullRequest
0 голосов
/ 29 марта 2019

Я пытаюсь отправить файл .jpg с помощью request и пытаюсь декодировать его в серверная часть django.

КОД:

Это код отправляющей стороны:

import requests
import os
import base64
fPath = os.getcwd()
url = 'http://127.0.0.1:8000/submitcausedata/'
headers = {'content-type': 'application/x-www-form-urlencoded'}
path_img = fPath + '/image13.jpg'
data = open(path_img,'rb').read()
encoded_image = base64.encodestring(data)   
print(encoded_image[:10])
r = requests.post(url,data=encoded_image,headers=headers)   

При получении кода завершения:

@csrf_exempt
def submitCauseData(request):   
    response_data = {}  
    if request.method == 'POST':
        data = request.POST     
        myDict = dict(data)     
        imageStr = list(myDict.keys())      
        imageStr = imageStr[0]
        print(imageStr[:10])
        image_result = open('image.jpg', 'wb')       
        image_result.write(base64.b64decode(imageStr))
        return HttpResponse("Page Exists")      

Итак, код выполняется, но когда я пытаюсь открыть сохраненное изображение, он показывает ошибку Photo Source File missing?

Код отправки:

print(encoded_image[:10])
----> b'/9j/4WQYRX'

Вывод кода принимающей стороны:

print(imageStr[:10])
----> /9j/4WQYRX

UPDATE:

При сравнении обоих файлов .jpg с использованием преобразования .txt многие значения в обоих из них отличаются при использовании DiffChecker Online.

Средство просмотра изображений в Ubuntu показывает ошибку при открытии .jpg на принимающей стороне:

Error interpreting JPEG image file (Unsupported marker type 0x10)

Также:

На отправляющей стороне:

print(len(data))
print(type(data))
print(len(encoded_image))
print(type(encoded_image))

OUTPUT:

171062
<class 'bytes'>
228084
<class 'bytes'>

На принимающей стороне:

print(len(imageStr))
print(type(imageStr))
print(len(imagedec))
print(type(imagedec))

OUTPUT:

228083
<class 'str'>
168972
<class 'bytes'>

Ответы [ 2 ]

0 голосов
/ 29 марта 2019

Я обнаружил ошибку, например, когда я пытаюсь отправить строку class из byte с отправляющей стороны, происходит преобразование всех '+' и '=' в ' ' на принимающей стороне.

Итак, используя:

Сторона отправки:

import requests
import os
import base64
fPath = os.getcwd()
url = 'http://127.0.0.1:8000/submitcausedata/'
headers = {'content-type': 'application/x-www-form-urlencoded'}
path_img = fPath + '/image13.jpg'
data = open(path_img,'rb').read()
encoded_image = base64.b64encode(data)  
r = requests.post(url,data=encoded_image,headers=headers)       

Сторона получения:

@csrf_exempt
def submitCauseData(request):   
    response_data = {}      
    if request.method == 'POST':
        data = request.POST     
        myDict = dict(data)     
        imageStr = list(myDict.keys())      
        image = imageStr[0].replace(' ','+')
        image = image.encode() + b'==='                             
        imagedec = base64.b64decode(image)
        fPath = os.getcwd()     
        image_result = open(fPath + '/image.jpg', 'wb')
        image_result.write(imagedec)
        image_result.close()            
        return HttpResponse("HELLO")        

Я исправил ошибку.

В любом случае, спасибо за помощь @waket-zheng:)

0 голосов
/ 29 марта 2019

Работает ли следующий код?

отправка

from base64 import b64encode
from pathlib import Path

import requests


url = "http://127.0.0.1:8000/submitcausedata/"
headers = {"content-type": "application/x-www-form-urlencoded"}
encoded_image = b64encode(Path("image13.jpg").read_bytes())
print(encoded_image[:10])
r = requests.post(url, data=encoded_image, headers=headers)

получение

from base64 import b64decode
from pathlib import Path    

@csrf_exempt
def submitCauseData(request):
    response_data = {}
    if request.method == "POST":
        imageStr = list(dict(request.POST).keys())[0]
        print(imageStr[:10])
        p = Path("image.jpg")
        p.write_bytes(b64decode(imageStr))
        return HttpResponse(f"Saved image to `{p.resolve()}`")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...