2

Я знаю, что этот вопрос уже задан раньше, например, здесь: How do I serve image Content-types with Python BaseHTTPServerRequestHandler do_GET method?, но типичный ответ «установить режим открытого файла в двоичный файл» для меня не работает.Как передать изображения клиенту с помощью Python BaseHttpRequestHandler в Windows?

Я использую Windows. Все запросы на текстовые данные (html, js, css) удовлетворяются без каких-либо проблем. Запросы изображений и шрифтов не выполняются должным образом. Ответные ответы всегда состоят примерно из 150 байтов (но на самом деле они должны быть около 50 тыс.). Итак, по сути, пустые ответы, я полагаю, с отсутствующими изображениями и шрифтами. У меня не было никаких проблем до сих пор под Linux с тем же кодом:

content = open(content_path, 'rb') 
... 
self.send_response(200) 
self.send_header('Content-type', 'image/jpeg') 
self.end_headers() 
self.wfile.write(content.read) 
content.close() 

Первоначально я использовал режим по умолчанию для «открытых» и после прочтения ответов на подобные вопросы, я добавил двоичный флаг предполагая, что это будет решить проблему, но это не так. Может быть, есть проблема с кодировкой? Опять же, это работает под Linux. Вот значение «содержания», выводимого на консоль:

<open file [my_file_path], mode 'rb' at 0x02A9BA18> with mime-type image/jpeg 

В случае, если это уместно, я, вероятно, следует также отметить, что изображения все время изменять размер питона библиотеки PIL перед ранее в заявке. Любая помощь приветствуется.

ответ

6

Вы отправили строковое представление метода read. Вместо вызова метода read() путем добавления:

self.wfile.write(content.read()) 

Если файл огромен, file.read() сделать проблему, так как содержимое файла read() загрузки в память. Чтобы этого избежать, используйте shutil.copyfileobj:

import shutil 

... 

self.send_response(200) 
self.send_header('Content-type', 'image/jpeg') 
self.end_headers() 
with open(content_path, 'rb') as content: 
    shutil.copyfileobj(content, self.wfile) 
+1

Я этому не верю. Это мое наказание за кодирование в 5:24 утра. Вы выиграли этот раунд, Python! Спасибо, сэр. – RTF

+0

@RTF, добро пожаловать. Идти спать! – falsetru

+0

Это хороший совет. – RTF

Смежные вопросы