2010-12-15 2 views
0

J'avais l'habitude d'utiliser CPython + PIL + bottle pour servir des fichiers image sur mon site web. J'ai utilisé le code ci-dessous pour servir directement les données d'image de la mémoire PIL. Maintenant, j'ai besoin d'utiliser IronPython au lieu de CPython pour servir les fichiers image. Maintenant, je dois utiliser IronPython au lieu de CPython. Et j'essaye de servir l'image du Microsoft Chart Control (System.Windows.Forms.DataVisualization.Charting).fichier image de MemoryStream (service Web IronPython)

# 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 

Mais cela ne fonctionne pas. Le fichier image servi sur le navigateur Web est cassé. Pouvez-vous m'aider à faire fonctionner ce code ironpython?

Répondre

0

J'ai trouvé une réponse (ou juste une solution de contournement). La str de ironpython est unicode, alors que str of de cpython (en dessous de 3) ne l'est pas. J'ai donc retiré la partie coulée des données Unicode vers WSGI compatible dans le cadre Bottle (ligne 543 de bottle.py), et renvoyer les données du flux comme ci-dessous.

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

Il est cette ligne:

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

En faisant cela, vous envoyez une chaîne qui est la forme codée des octets dans l'image alors qu'en réalité, vous voulez juste d'envoyer les octets.

J'imagine que si vous changez à ceci:

contents = stream.ToArray() 

Il pourrait travailler (je ne suis pas un gars python). L'idée ici est de passer les octets, pas une chaîne de retour au client faisant la demande.

+0

Merci pour la réponse, mais cela ne semble pas fonctionner. J'ai essayé ceci avant, il a fait l'erreur interne de serveur (web). Je suppose que j'ai besoin de convertir le type .net (Byte []) en type python (str ou quelque chose) –