2010-12-15 25 views
0

私は以前、CPython + PIL + bottleを使用して自分のWebサイトに画像ファイルを提供していました。以下のコードを使用して、PILメモリから画像データを直接提供しました。MemoryStream(IronPython Webサービス)からの画像ファイル

# 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 

ここで、イメージファイルを提供するためにCPythonの代わりにIronPythonを使用する必要があります。そして私はMicrosoft Chart Control(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 

しかし、これは機能しません。 Webブラウザ上の提供されたイメージファイルが壊れています。このironpythonコードの動作をどうやって手助けできますか?

答えて

0

回答が見つかりました(または回避策のみ)。 Ironpythonのstrはunicodeですが、cpythonのstr(3以下)はそうではありません。そこで、Unicodeデータのキャスト部分をBottleフレームワークのWSGI互換にしました(bottle.pyの543行目)、以下のようにストリームデータを返します。

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

それはこの行です:これを行うには

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

、あなたは現実には、あなただけのバイトを送信する場合、画像内のバイトの符号化された形式の文字列を送信しています。あなたはこのように変更した場合

私が想像:

contents = stream.ToArray() 

をそれがうまくいくかもしれない(私はPythonの男ではありませんよ)。ここでの考え方は、文字列ではなくバイトをクライアントに返すことです。

+0

回答ありがとうございますが、これはうまくいかないようです。私はこれを前に試してみましたが、それは内部(ウェブ)サーバーエラーになりました。私は、.net型(Byte [])をpython型(strまたは何か)に変換する必要があると思います。 –

関連する問題