python / cgi - служит для искаженных изображений - PullRequest
0 голосов
/ 30 октября 2010

Я уже пару часов бьюсь над обслуживанием jpg с сайта Python CGI.По некоторым причинам изображения всегда получаются искаженными.

Вот мой код:

print('Content-type: image/jpg\n')
path = 'C:\\Users\\Admin\\Documents\\image.jpg'
print file(path, 'rb').read()

В этом посте описывается почти идентичная проблема, однако я не использую WSGI,Я использую windows и apache и поиграл с \r\n\r\n, а также print 'Content-type: image/jpg\r\n\r\n',.Точно так же я пытался print file(path, 'rb').read(), думать, что новая строка может как-то искажать изображение.

Есть еще идеи по устранению неполадок?

Спасибо, Джош

пс.Сайт должен оставаться сайтом cgi.

[править] изменен на print('Content-type: image/jpeg\n')

[править] пример изображения: alt text

1 Ответ

2 голосов
/ 31 октября 2010

Эта статья показывает отправку файла в CGI с использованием C ++. Программа позаботится о преобразовании стандартного вывода в двоичный файл:

int main()
{
#if _WIN32
    // Standard I/O is in text mode by default; since we intend
    // to send binary image data to standard output, we have to
    // set it to binary mode.
    // Error handling is tricky to say the least, so we have none.
    _fmode = _O_BINARY;
    if (_setmode(_fileno(stdin), _fmode) == -1) {}
    if (_setmode(_fileno(stdout), _fmode) == -1) {}
#endif

Вы можете сделать это в Python. Здесь - решение для Windows:

import sys

if sys.platform == "win32":
    import os, msvcrt
    msvcrt.setmode(sys.stdout.fileno(), os.O_BINARY)

Здесь - это код, специфичный для python 3.x:

Стандартные потоки в текстовом режиме по умолчанию. Написать или прочитать двоичный файл данные к ним, использовать основную двоичный буфер. Например, написать байты в стандартный вывод, используйте sys.stdout.buffer.write (b'abc '). С помощью io.TextIOBase.detach () потоки могут быть сделал бинарный по умолчанию. Эта функция устанавливает stdin и stdout в двоичный файл:

def make_streams_binary():
    sys.stdin = sys.stdin.detach()
    sys.stdout = sys.stdout.detach()

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

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