0

この質問に回答しているときに、GAE によるフォーム POST からのファイル アップロードの処理に関する奇妙な動作に遭遇しました。

質問1:私が誤解しない限り、self.request.POST['filecsv']これはcgi.FieldStorageインスタンスであり、このスレッドのOPで説明されているように(ただし回答はありません)、cgi docs、、、およびドキュメント記載されている他のすべてのメソッドは、オブジェクトですが、スレッドが述べているように、GAE で typeError をスローします。keys()len()

最初の質問は、なぜそれらが利用できないのかということです。

質問 2 : ファイルの内容にアクセスする簡単な方法は、次のvalue属性を使用することです。

my_file = self.request.POST['filecsv'].value

value属性が にリストされていないのはなぜdir(self.request.POST['filecsv'])ですか?

最後の質問: FieldStorage インスタンスのすべての属性は実際に GAE で機能しますか?

4

1 に答える 1

3

利用できない理由

彼らは確かに

logging.error(self.request.POST['uploadimage'].keys)

版画

ERROR    2013-06-22 05:47:46,605 FileuploadHandler.py:29] <bound method FieldStorage.keys of FieldStorage(u'uploadimage', u'30.jpg')>

このメソッドを呼び出すとTypeErrorエラーが発生します

TypeError: not indexable

このエラーが発生しないように、オブジェクトの content-type は または のいずれかにする必要がありapplication/x-www-form-urlencodedますmutlipart/*。画像や音声ファイルのような単一のファイルの場合、content-type はファイルの MIME タイプ (image/jpeg、audio/ogg など)になり__contains__ます。has_keyskeys__len____getitem__

value 属性がディレクトリにリストされていないのはなぜですか

それは本当の属性ではないからです。これが cgi.FieldStorage の__getattr__メソッドです。

def __getattr__(self, name):
    if name != 'value':
        raise AttributeError, name
    if self.file:
        self.file.seek(0)
        value = self.file.read()
        self.file.seek(0)
    elif self.list is not None:
        value = self.list
    else:
        value = None
    return value

したがって、独自のメソッドdir()を実装しない限り、それについてはわかりません__dir__

仮想値属性にアクセスしようとしたときに次のエラーが発生した場合

AttributeError: 'unicode' object has no attribute 'value'

次に、HTML フォームの enctype を に設定する必要がありますmultipart/form-data

于 2013-06-22T06:45:49.113 に答える