файл изображения из MemoryStream (веб-сервис IronPython) - PullRequest
0 голосов
/ 15 декабря 2010

Я использовал CPython + PIL + бутылку для показа файлов изображений на моем веб-сайте. Я использовал приведенный ниже код для прямой передачи данных изображения из памяти PIL.

# works well in CPython
@route('/test')
def index():
    response.set_content_type('image/png')
    img = DrawSomePILImage()
    output = StringIO.StringIO()
    img.save(output,'PNG')
    contents = output.getvalue()
    output.close()
    return contents

Теперь мне нужно использовать IronPython вместо CPython для обслуживания файлов изображений. И я пытаюсь обслуживать образ элемента управления диаграммой Microsoft (System.Windows.Forms.DataVisualization.Charting).

# image is broken in IronPython
@route('/test')
def index():
    response.set_content_type('image/png')
    cht = GetChartControl()
    stream = MemoryStream()
    cht.SaveImage(stream, ChartImageFormat.Png)
    contents = System.Text.ASCIIEncoding.ASCII.GetString(stream.ToArray())
    stream.Close()
    return contents

Но это не работает. Файл обслуживаемого изображения в веб-браузере не работает. Не могли бы вы, ребята, помочь мне, как заставить работать этот код Ironpython?

Ответы [ 2 ]

0 голосов
/ 15 декабря 2010

Я нашел ответ (или просто обходной путь).Str of Ironpython является Unicode, в то время как Str of Cpython (ниже 3) - нет.Поэтому я удалил часть преобразования данных Unicode в WSGI-совместимый в среде Bottle (строка 543 из bottle.py) и вернул данные потока, как показано ниже.

contents = ''.join([chr(v) for v in stream.ToArray()])
0 голосов
/ 15 декабря 2010

Вот эта строка:

contents = System.Text.ASCIIEncoding.ASCII.GetString(stream.ToArray()) 

При этом вы отправляете строку, которая является закодированной формой байтов на изображении, когда в действительности вы просто хотите отправить байты.

Я полагаю, если вы измените это на:

contents = stream.ToArray()

Это может сработать (я не парень с питоном). Идея в том, чтобы передать байты, а не строку обратно клиенту, выполняющему запрос.

...