在回答this question时,我遇到了一些奇怪的行为,GAE处理来自表单POST的文件上传。
问题:除非我误解,self.request.POST['filecsv']
是一个cgi.FieldStorage实例,并且正如this thread中的OP所解释的那样(但没有回答),并且cgi docs,keys()
,len()
以及文档中提到的所有其他方法都应该可用于对象,但它们会在GAE中抛出一个typeError - 正如线程所述。
所以第一个问题是,为什么它们不可用?
问题二:访问文件内容的简单方法是value
属性:
my_file = self.request.POST['filecsv'].value
为什么value
中没有列出dir(self.request.POST['filecsv'])
属性?
上一个问题:FieldStorage实例的所有属性是否实际在GAE中有效,我只是不知道如何使用它们?
答案 0 :(得分: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-urlencoded
或mutlipart/*
。对于像图像或音频文件这样的单个文件,内容类型将是文件的mimetype,例如image / jpeg,audio / ogg等,因此方法__contains__
,has_keys
,keys
,__len__
,__getitem__
会针对单个文件引发TypeError。
为什么值属性未在dir中列出
因为它不是真正的属性。这是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
。