Передача двоичных данных с использованием http-запросов - PullRequest
0 голосов
/ 22 марта 2019

Я пытаюсь передать файлы, такие как изображения jpg, разделив файлы на куски, а затем отправив их через http get или отправив запросы на другой сервер, где я пытаюсь собрать файлы обратно вместе. Для декодирования я использую модуль pythons base64. Вот клиентское приложение:

import requests
import base64

URL = "http://10.0.2.5:8080/index.php"

export_file = open("C:\\Users\zarathustra\\Desktop\\cat.jpg", "rb")

while True:
    export_data = base64.urlsafe_b64encode(export_file.read(1024))
    if export_data:
        parameter = {"data" : export_data}
        r = requests.get(url = URL, params=parameter)
    else:
        print ("File transmitted.")
        break

А вот приложение, которое получает данные:

from http.server import BaseHTTPRequestHandler, HTTPServer
import base64

class my_Request_Handler(BaseHTTPRequestHandler):

    def _set_response(self):
        self.send_response(200)
        self.send_header('Content-type', 'text/html')
        self.end_headers()

    def do_GET(self):

        output_file = open("/home/zarathustra/exfiltration.txt", "a")
        output_file.write(base64.urlsafe_b64decode(self.path[16:]))
        output_file.close()

        self._set_response()
        self.wfile.write("GET request for {}".format(self.path).encode('utf-8'))

Я использую другой скрипт для повторной сборки данных:

import base64

file = open("/home/zarathustra/exfiltration.txt", "r")
data = file.read()
data2 = base64.b64decode(file.read())
file2 = open("/home/zarathustra/Katze.jpg", "wb")
file2.write(data2)

file.close()
file2.close()

Принимающее приложение выдает следующую ошибку:

Exception happened during processing of request from ('10.0.2.15', 51475)
Traceback (most recent call last):
  File "/usr/lib/python3.7/socketserver.py", line 316, in _handle_request_noblock
    self.process_request(request, client_address)
  File "/usr/lib/python3.7/socketserver.py", line 347, in process_request
    self.finish_request(request, client_address)
  File "/usr/lib/python3.7/socketserver.py", line 360, in finish_request
    self.RequestHandlerClass(request, client_address, self)
  File "/usr/lib/python3.7/socketserver.py", line 720, in __init__
    self.handle()
  File "/usr/lib/python3.7/http/server.py", line 426, in handle
    self.handle_one_request()
  File "/usr/lib/python3.7/http/server.py", line 414, in handle_one_request
    method()
    print(base64.urlsafe_b64decode(self.path[16:]))
  File "/usr/lib/python3.7/base64.py", line 133, in urlsafe_b64decode
    return b64decode(s)
  File "/usr/lib/python3.7/base64.py", line 87, in b64decode
    return binascii.a2b_base64(s)
binascii.Error: Incorrect padding

Я исследовал некорректную ошибку заполнения с помощью stackoverflow и попробовал некоторые варианты, но не смог найти работающее решение. Также я не уверен, что мой appproach для разделения / декодирования и повторной сборки корректен. Есть предложения?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...