2010-12-15 13 views
0

Ich verwendete CPython + PIL + bottle, um Bilddateien auf meiner Website zu liefern. Ich habe den folgenden Code verwendet, um die Bilddaten direkt aus dem PIL-Speicher zu liefern.Bilddatei von MemoryStream (IronPython-Webdienst)

Jetzt muss ich IronPython anstelle von CPython verwenden, um Image-Dateien zu liefern. Und ich versuche, das Bild des Microsoft Chart Control (System.Windows.Forms.DataVisualization.Charting) bereitzustellen.

# 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 

Aber das funktioniert nicht. Die gediente Bilddatei im Webbrowser ist beschädigt. Kannst du mir helfen, wie dieser Ironpython-Code funktioniert?

Antwort

0

Ich habe eine Antwort (oder nur einen Workaround) gefunden. Die str von ironpython ist Unicode, während str von cpython (unter 3) nicht ist. Also entfernte ich den Casting-Teil von Unicode-Daten in WSGI-kompatibel in Bottle-Framework (Zeile 543 von bottle.py) und gab die Stream-Daten wie folgt zurück.

contents = ''.join([chr(v) for v in stream.ToArray()]) 
0

Es ist diese Zeile:

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

dies Dabei, Sie senden eine Zeichenfolge, die die codierte Form des Bytes im Bild ist, wenn in Wirklichkeit, man muss nur das Bytes gesendet werden sollen.

Ich stelle mir vor, wenn Sie es so weit ändern:

contents = stream.ToArray() 

Es könnte funktionieren (ich bin nicht ein Python-Typ). Die Idee hier ist, die Bytes, nicht eine Zeichenfolge zurück an den Client übergeben die Anfrage.

+0

Danke für die Antwort, aber das scheint nicht funktionieren. Ich habe das schon mal probiert, es hat einen internen (Web-) Serverfehler gemacht. Ich denke, ich muss .net Typ (Byte []) in Python-Typ (str oder etwas) konvertieren –