1

私がやろうとしているのは、私の Pylons アプリに、いくつかのデータに基づいて画像を動的に生成させ、それをブラウザーで表示できるような方法で返すことです。

これまでのところ、次のようにイメージを生成しています。

import Image, ImageDraw
image = Image.new("RGB", (width, height),"black")
img_out = ImageDraw.Draw(image)
img_out.polygon(...
img_out.text(...
#etc

画像が正常に生成され、次のようにファイルに保存することもできます。

img_out.save(filepath)

私の問題は、ディスクに書き込もうとしているのではなく、Pylons 応答を介して返そうとしていることです。別の質問への回答に基づいて、私はこれまでに得ることができました:

import FileApp
my_headers = [('Content-Disposition', 'attachment; filename=\"' + user_filename + '\"'), ('Content-Type', 'text/plain')]
file_app = FileApp(filepath, headers=my_headers)
return file_app(request.environ, self.start_reponse)

このソリューションを使用して、サーバー側に保存した png を取得し、ダウンロードのためにユーザーに返すことができます。それでも、ここには 2 つの問題があります。1 つ目は、単にコードからイメージを直接使用するのではなく、ファイルをディスクに書き込んでディスクから提供することを余儀なくされていることです。2 つ目は、実際にファイルを返すため、ユーザーはブラウザでファイルを表示するのではなく、ファイルをダウンロードすることを余儀なくされます。

私が望むのは、ユーザーが自分でファイルをダウンロードするのではなく、ブラウザでファイルを表示できるようにすることです。理想的には、サーバー側のディスクに画像を保存する必要もありませんが、サーバーまたはクライアントのコンピューターに存在しないと、画像を提供することはおそらく不可能であることを認識しています.

だから私の質問はこれです。ユーザーがリクエストへの応答としてブラウザで画像を表示するように、コードから直接画像を提供できますか? そうでない場合、画像をディスクサーバー側に保存し、そこから提供して、ユーザーがブラウザで画像を表示し、ファイルのダウンロードを求められないようにすることはできますか?

(私は Python 2.6.2 と PasteScript 1.7.4.2 を使用しています)

4

1 に答える 1

1

ブラウザは、 base64 でエンコードされた のsrc属性の一部として生データを受け入れることができます...img

from PIL import Image
from cStringIO import StringIO

a = Image.new('RGB', (10, 10), 'black')
# ...
buf = StringIO()
a.save(buf, 'png')
b64img = '<img src="data:image/png;base64,{0}" />'.format(buf.getvalue().encode('base64'))

したがって、ここで行うことは、イメージを作成し、(ディスクではなく) メモリ内の文字列バッファーに保存してから、base64 にエンコードすることです...<img>タグをページの一部として返します (または、遅延している場合は純粋に単独で) ) どんなテンプレート/etc を使っても...多分ただそれをするreturn Response(b64img)でしょう...

于 2013-07-21T20:41:29.080 に答える