Как загрузить файл на веб-сервер Python? - PullRequest
0 голосов
/ 20 ноября 2018

Я пытаюсь написать базовый веб-сервер на 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 "бинарный файл и сохранить его на диске?

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