1

zipファイルを受け入れるアップロードフォームがあり、それを解凍してそこから各ファイルを取得する方法があります。その md5 ハッシュから一意の ID を作成し、それらを辞書に格納します。

dict[uid] = imagebinary

フォームがそれらを ZODB に格納できるように、それを返します。このエラーが吐き出されるため、画像をそのまま保存することはできません。

    2013-01-31 08:59:59,061 ERROR [waitress][Dummy-5] Exception when serving /
Traceback (most recent call last):
  File "/home/maverick/inigo/sources/devenv/lib/python2.7/site-packages/waitress-0.8.2-py2.7.egg/waitress/channel.py", line 329, in service
    task.service()
  File "/home/maverick/inigo/sources/devenv/lib/python2.7/site-packages/waitress-0.8.2-py2.7.egg/waitress/task.py", line 173, in service
    self.execute()
  File "/home/maverick/inigo/sources/devenv/lib/python2.7/site-packages/waitress-0.8.2-py2.7.egg/waitress/task.py", line 380, in execute
    app_iter = self.channel.server.application(env, start_response)
  File "/home/maverick/.buildout/eggs/pyramid-1.4-py2.7.egg/pyramid/router.py", line 251, in __call__
    response = self.invoke_subrequest(request, use_tweens=True)
  File "/home/maverick/.buildout/eggs/pyramid-1.4-py2.7.egg/pyramid/router.py", line 227, in invoke_subrequest
    response = handle_request(request)
  File "/home/maverick/inigo/sources/devenv/lib/python2.7/site-packages/pyramid_debugtoolbar-1.0.4-py2.7.egg/pyramid_debugtoolbar/toolbar.py", line 133, in toolbar_tween
    body = tb.render_full(request).encode('utf-8', 'replace')
  File "/home/maverick/inigo/sources/devenv/lib/python2.7/site-packages/pyramid_debugtoolbar-1.0.4-py2.7.egg/pyramid_debugtoolbar/tbtools.py", line 240, in render_full
    summary = self.render_summary(include_title=False, request=request)
  File "/home/maverick/inigo/sources/devenv/lib/python2.7/site-packages/pyramid_debugtoolbar-1.0.4-py2.7.egg/pyramid_debugtoolbar/tbtools.py", line 229, in render_summary
    'description':  description_wrapper % escape(self.exception),
UnicodeDecodeError: 'ascii' codec can't decode byte 0xef in position 114: ordinal not in range(128)

では、どうすればいいのでしょうか?私はこれにかなりこだわっています。

4

1 に答える 1

3

表示されるエラーは、ZODB に保存されているイメージとは関係ありません。

Blobより大きなデータを格納するには、画像データを属性に直接配置するのではなく、ZODB を使用する必要があります。Blobs は個別にディスクに格納され、ZODB キャッシュをフラッシュせず、再度アクセスしたときにクライアントにストリーミングして戻すことができます。

を作成して保存するBlobには、次を使用します。

from ZODB.blob import Blob

uid = Blob(imagebinary.read())

そのように作成したら、後でuidファイルとして使用できます。最初に読み取りモードまたは書き込みモードで開く必要があります。たとえば、ビューから BLOB のコンテンツを返すには、次を使用します。

from pyramid.response import Response

def serveimage(request):
    # retrieve uid from somewhere
    resp = Response(content_type='image/jpeg')
    resp.app_iter = uid.open('r')  # open for reading
    return resp

BLOB はトランザクションにバインドされ、トランザクションがロールバックされると、BLOB への変更は自動的に破棄されます。

于 2013-02-01T11:21:57.627 に答える