以下の方法で画像を単独で表示させることはできたけど、文章内に画像を表示させるのは一時的にキャッシュファイルにした方がいいのかなぁ。SQL Object FAQにもあったようにDBに突っ込む前にbase64でエンコード。でもぶっちゃけこれであってる確信全然無い、挙動把握できてないし。しかもtubogears(cherrypy)経由で画像の保存ができてないし。(tg-admin shellからやった)→解決
# ===== mode.py ===== class Image(SQLObject): data = StringCol() height = IntCol() width = IntCol() def _set_data(self, value): self._SO_set_data(value.encode('base64')) def _get_data(self): return self._SO_get_data().decode('base64') # # # ===== controller.py ===== class Root(Controllers.Root): @turbogears.expose() def getFile(self): image = Image.select(orderBy=Image.q.id)[0] cherrypy.response.headerMap['Content-Type'] = 'image/jpeg' return image.data
で、cherryPyで作業ディレクトリのファイルを直接見せようとしてもうまくいかない、ガッデム。っていうかドキュメントどころかTipsすらまともに見付からない、生産性悪い気がしてきたしruby on railsに乗り換えようかなぁ。ぇ、ソース読まないならOSSに手を出すなって?ごもっとも...orz。
pythonでも@やら*やら使われてきたんじゃ自分がpythonを使っている理由「特殊記号が無い」が成り立たないし、くそー、とりあえずもう少し調べよう。
というわけでまぁ解決、っていうかそもそもの前提が間違えていた。「http://localhost:8080/test.jpg」みたいなURLで画像に大してアクセスできないか試していたけど、これじゃ"test.jpg"ってページを見に行ってるんだから見れなくて当り前じゃないか...、何考えていたんだろう自分(泣。
というわけで、引数を渡して任意の画像を指定するメソッドを作ってそのメソッドから画像データを投げさせるようにした。文章中に画像を張り付けたいときは、imgタグのsrcでそのメソッドを指定させれば画像は表示できた。
なんだか最初から最後まで考えれば当然の事なのにやってる最中はムキになって全然ちゃんと見ようとしていなかったorz。なんていうか全く無駄な事に馬力使ってしまった。まぁこれで問題も解決したし、今度からはもっと落ち着こう。
あ、作業ディレクトリはパスを直接書き出させた結果、プロジェクトのルート、つまり***-start.pyがあるディレクトリだった。
アップローダからのデータの受け取りは一つ目のリンクのコードをコピー、でImageオブジェクトを生成する際に以下のように生成した。
@turbogears.expose() def postFile(self): ... file = dataDict['myFile'] hub.begin() # heightとwidthの値は適当、参照されていないけどとりあえずつっこんでるだけ image = Image(data=file.value, height=100, width=100) hub.commit() hub.end() ...
何を渡すべきかはFieldStorageのドキュメントを読んで確認した。pythonでは他にもcgiへのアクセス方法はあるけど、CherryPyのドキュメントではFieldStorageを使うことを勧めていたのでこれに則ってコーディングする。
やっとpythonがわかってきた感じ(遅、そもそも動的に型が決まるっていうのはまだ慣れないなぁ。基本がJavaなせいかも。