CherryPyでファイルアップロード

ふとどうやるんだろうと思い、調べてみた。
どうせTurboGearsでもCherryPyでも根本的には変わらないと思うので、
安定しているCherryPyで試作。

CherryPy - a pythonic, object-oriented web development framework
http://www.cherrypy.org/wiki/FileUpload

というピンポイントの説明発見。
そしてパクリまくる(というかほとんどそのまま)

import cherrypy

class Root:
    def index(self):
        return """
        <html><body>
            <form action="upload" method="post" enctype="multipart/form-data">
            filename: <input type="file" name="myFile"/><br/>
            <input type="submit"/>
            </form>
        </body></html>
        """
    index.exposed = True

    def upload(self, myFile):
        f = file(myFile.filename, 'w')
        while True:
            data = myFile.file.read(1024 * 8)
            if not data:
                break
            f.write(data)
        f.close()
        
        return """
        <html><body>
            myFile filename: %s<br/>
            myFile mime-type: %s<br/>
            The file has been saved.
        </body></html>
        """ % (
            myFile.filename,
            myFile.type
        )
    upload.exposed = True

cherrypy.root = Root()
cherrypy.server.start()

Chapter 3. Reference
http://www.cherrypy.org/cherrypy-2.1.0/docs/book/chunk/ch03.html#id3129747

を参考にしました。

なにやらtypoe="file"でもらったデータは

file
filename
type

の三種類があるようです。
おそらくこのやり方だと結構危ないので実際には使えないと思います。

リファレンスにも書いてありますが、
cgi.FieldStorage
を使えと書いてあるので実際はこちらを使うべきでしょう。

となると前にでてた例そのままですね…。

TurboGearsの例ではcgi.FieldStorageは使っていなかったような気がします。
まぁ実際はファイルなぞ作成せずDBに格納するべきですね。

自分への課題(期限なし)
CherryPyとSQLAlchemyを使ったアップロードシステムを作成せよ。