Я пытаюсь написать базовый веб-сервер на python, который должен иметь возможность обрабатывать почтовые запросы с файлами и сохранять его локально.
Вот мой пример:
import logging
from http.server import BaseHTTPRequestHandler, HTTPServer
class Server(BaseHTTPRequestHandler):
def _set_response(self):
self.send_response(200)
self.send_header('Content-type', 'text/html')
self.end_headers()
def do_POST(self):
content_length = int(self.headers['Content-Length']) # <--- Gets the size of data
post_data = self.rfile.read(content_length) # <--- Gets the data itself
self.save_file(post_data)
self._set_response()
self.wfile.write("POST request for {}".format(self.path).encode('utf-8'))
def save_file(self, file):
output_file = open("file.saved", "wb")
output_file.write(file)
output_file.close()
def run(server_class=HTTPServer, handler_class=Server, port=8080):
server_address = ('', port)
httpd = server_class(server_address, handler_class)
try:
httpd.serve_forever()
except KeyboardInterrupt:
pass
httpd.server_close()
if __name__ == '__main__':
from sys import argv
if len(argv) == 2:
run(port=int(argv[1]))
else:
run()
post_data
, который я получаю в do_POST
, кроме самого файла, содержащего другую мета-информацию о самом запросе, я не могу понять, как извлечь из post_data
только двоичный файл.
Вот примерпочтового запроса, который должен обслуживать сервер:
cURL:
curl -X POST \
http://localhost:8080/x/ \
-H 'Postman-Token: 69de1364-88e8-47d1-9c2e-1e0e1d634c8b' \
-H 'cache-control: no-cache' \
-H 'content-type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW' \
-F 'file=@D:\files\Git-2.13.3-64-bit.exe'
HTTP:
POST /x/ HTTP/1.1
Host: localhost:8080
cache-control: no-cache
Postman-Token: 3c216882-8160-4936-be7e-263cf56c7d4d
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="file"; filename="D:\Installs\Git-2.13.3-64-bit.exe
------WebKitFormBoundary7MA4YWxkTrZu0gW--
Как извлечь из post_data
только переменную "Git-2.13.3-64-bit.exe "бинарный файл и сохранить его на диске?