Python сокет - загрузка файлов работает только в chrome - PullRequest
0 голосов
/ 17 февраля 2020

Итак, я создал код, который клиент загружает файл в папку на сервере, и он имеет возможность загрузить его обратно, он отлично работает в chrome, Я нажимаю на элемент, который я хочу загрузить, и он загружает его

def send_image(request, cs):
    request = request.split('=')
    try:
        name = request[1]
    except:
        name = request[0]
    print('using send_iamge!')
    print('Na ' + name)
    path = 'C:\\Users\\x\\Desktop\\webroot\\uploads' + '\\file-name=' + name
    print(path)
    with open(path, 'rb') as re:
        print('exist!')
        read = re.read()
        cs.send(read)

приведенный выше код читает выбранный вами файл и отправляет данные в виде байтов клиенту обратно. В chrome он загружает файл, как я уже показал вам, но, например, в inte rnet explorer, он просто печатает данные клиенту и не загружает их Реальный вопрос - почему он просто печатает данные в chrome, почему он их загружает, а не печатает так, как это делает inte rnet explorer, и как я могу это исправить? (для вашей информации: все загружаемые файлы имеют имя-имя-файла перед ними, поэтому я положил его туда)

http запрос: ОБНОВЛЕНИЕ:

 POST /upload?file-name=Screenshot_2.png HTTP/1.1
Host: 127.0.0.1
Connection: keep-alive
Content-Length: 3534
Accept: */*
X-Requested-With: XMLHttpRequest
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36
Content-Type: application/octet-stream
Origin: http://127.0.0.1
Sec-Fetch-Site: same-origin
Sec-Fetch-Mode: cors
Referer: http://127.0.0.1/
Accept-Encoding: gzip, deflate, br
Accept-Language: en-GB,en;q=0.9,en-US;q=0.8,he;q=0.7

1 Ответ

1 голос
/ 17 февраля 2020

Похоже, что вы отправляете не ответ HTTP / 1, а ответ HTTP / 0.9 (обратите внимание, что я имею в виду ответ, отправленный с сервера, а не запрос, отправленный с клиента). Ответ HTTP / 1 состоит из заголовка HTTP и тела HTTP, аналогично тому, как создается запрос HTTP. Ответ HTTP / 0.9 вместо этого состоит только из фактического тела, то есть без заголовка и, следовательно, без мета-информации в заголовке, которая сообщает браузеру, что делать с телом.

HTTP / 0.9 устарел на 25 лет, но некоторые браузеры все еще поддерживают это. Когда браузер получает запрос HTTP / 0.9, он может что угодно, поскольку в заголовке HTTP нет определенного значения. Браузеры могут попытаться интерпретировать это как HTML, как обычный текст, предложить его для загрузки, полностью отказаться от него ... - что угодно.

Способ решения проблемы - отправить фактический заголовок ответа HTTP перед отправкой тела, т.е. что-то вроде этого

 cs.send("HTTP/1.0 200 ok\r\nContent-type: application/octet-stream\r\n\r\n")
 with open(path, 'rb') as re:
     ...
     cs.send(read)

В любом случае: HTTP гораздо сложнее, чем вы думаете. Существуют установленные библиотеки для решения этой проблемы. Если вы настаиваете на том, чтобы не использовать какую-либо библиотеку, изучите стандарт, чтобы избежать подобных проблем.

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