wiki.zope.jp
BLOBs
   
RecentChanges WikiHelp WikiPractice JumpSearch

BLOBs

Upload, Insert and Retrieval of BLOBs

原文: http://www.zope.org/Members/murphy/MySQL-BLOBs

をかなり適当ですが訳してみました。


BLOBのアップロードおよびインサートと検索について 作者murphy 最終更新日2002/12/22

この文書はBLOBの取扱について説明したものです。イメージデータの扱いについてZope 2.5.1とMySQL上に特化しています。 他のDBMSにこの手続きを容易に適応させることができるでしょう。MIMEタイプ、あるいはCLOBに。 Python、Z SQLMethod?およびHTMLについての知識はこのHow-Toを理解するために必須です。

次のサンプルは、あなたが誰かの写真をアップロードしたい、MySQLのPhotoテーブルにそれを挿入する、と仮定し、 以下の様にテーブル属性を定めます。

Name Type Person_ID INT UNSIGNED, primary key Pic BLOB, not null Type VARCHAR(4), not null

また、あとからZopeドキュメント上で検索し表示します。

--------------------------------------------------------------------------------

アップロードのためのHTMLフォームは次のようなサンプルです:

<form action="newPhoto.py" method="post" enctype="multipart/form-data">
<input name="pid" type="hidden" value="&dtml-ID;">
<input name="Photo" type="file" maxlength="65535" accept="image/*">
<input type="submit" value="Insert Picture">
</form>

アップロードされたデータのサイズにより、ポストメソッドを使用しなければなりません。hiddenフィールドはDTML namespaceの中の変数から検索されて、person's IDを提供します。属性maxlengthおよびacceptmay、ファイル入力のために与えられるが、すべてのブラウザーにかならずしもサポートされるとは限りません。したがって、イメージのこの特性は、処理スクリプトの中で再びチェックされるべきです。

ID newPhoto.pyのPythonスクリプトは、ファイル拡張によってMIMEタイプのアップロードされたファイルを認識する役目です:

photo = container.REQUEST.form['Photo']? filedata = photo.read() filetype = string.split(guess_content_type(photo.filename)[0]?, "/")

このスクリプトはZopeのコア関数 OFS.content_types.guess_content_type()(パイソン・スクリプトの中で使用されることを通常許されない)を利用します。この関数へのアクセスのために、次を行わなければならないでしょう。

allow_module(OFS.content_types.guess_content_type)

in the file PATH-TO-ZOPE/lib/python/Products/GlobalModules?/__init__.py

PATH-TO-ZOPE/lib/python/Products/GlobalModules?/__init__.pyファイルの中で

警告: 機能およびモジュールの実行にこの方法を与えることはあなたのZopeシステムおよびスクリプトでセキュリティ問題を発生させるかもしれません。よりよい解決は言及された機能にアクセスするExternal Methodの使用になるでしょう。External Methodが使用できる今、Zope Class、Imageファイルをまた分類します。したがって、私はこのセキュリティ問題をそれほど重要とみません。 とにかく、ここでのように非常に限定的で単一の機能(全体のモジュールのためにではなく)のためにならアクセス許可されるべきです。

これでこの関数を使用できます。

from OFS.content_types import guess_content_type

こうして呼びます。返されたMIMEの上のコード断片では、タイプが分離する「/」によって2つのストリングへsplittedされます(もちろん、ストリングのモジュールはインポートされたに違いありません)。同じスクリプトnewPhoto.pyの中でlen()(以下、対応する属性タイプのDBMSにふさわしい)によるサイズ用のfiledataおよび正しいMIMEタイプ(ここで、イメージだけが容認されます)をチェックした後に、DBへperson's ID、イメージ・データおよびタイプの第2の部分を格納することができます:

context.insertPhoto(Person_ID=container.REQUEST.pid, Pic=filedata, Type=filetype[1]?)

これに対応するinsertPhoto Z SQL Methodはこの3つのパラメーターを受けるよう、次のようにします:

insert into Photo set sqltest Person_ID op="eq" type="int">, sqltest Pic op="eq" type="string">, sqltest Type op="eq" type="string">

--------------------------------------------------------------------------------

イメージデータの検索はもう少しシンプルです。peson's IDでデータを取って来るZ SQL Method(getPhoto)をもちろん必要とします(パラメーターPerson_ID):

select Pic, Type from Photo where sqltest Person_ID op="eq" type="int">

PIDによりこのメソッドを呼んで、レスポンスのために正確なMIMEタイプをセットしイメージ・データを返すことは、 fetchPhotoとつけた別のパイソン・スクリプトの中で起こります(それは主として3行のラインから成る):

photo = context.getPhoto(Person_ID = pid) container.REQUEST.RESPONSE.setHeader(content-type, image/ + photo[0]?.Type) return photo[0]?.Pic

このスクリプトは正確なPIDを指定する必要だけでファイル参照のように<img>タグの中で使用することができます:

<img src="fetchPhoto?pid=&dtml-ID;" alt="Photo">


Last edited Mon, 11 Sep 2006 13:48:30 +0900 Edit this page