0

在回答这个问题时,我遇到了 GAE 处理来自表单 POST 的文件上传的一些奇怪行为。

问题一:除非我误解,否则self.request.POST['filecsv']它是一个 cgi.FieldStorage 实例,并且正如 OP 在这个线程中解释的(但没有回答),在cgi 文档中,keys()文档len()中提到的所有其他方法都应该可供对象,但他们在 GAE 中抛出 typeError - 正如线程所述。

所以第一个问题是,为什么它们不可用?

问题二:访问文件内容的简单方法是通过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

为了不出现此错误,对象的内容类型应为application/x-www-form-urlencodedmutlipart/*。对于像图像或音频文件这样的单个文件,内容类型将是文件的 mimetype,例如 image/jpeg、audio/ogg 等,因此方法__contains__, has_keys, keys, __len__,__getitem__将为单个文件引发 TypeError。

为什么 dir 中没有列出 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 回答