为什么GAE中的POST文件上传无法访问cgi.Fieldstorage方法?

时间:2013-06-22 04:39:01

标签: python google-app-engine file-upload csv cgi

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

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

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

问题二:访问文件内容的简单方法是value属性:

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

为什么value中没有列出dir(self.request.POST['filecsv'])属性?

上一个问题:FieldStorage实例的所有属性是否实际在GAE中有效,我只是不知道如何使用它们?

1 个答案:

答案 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-urlencodedmutlipart/*。对于像图像或音频文件这样的单个文件,内容类型将是文件的mimetype,例如image / jpeg,audio / ogg等,因此方法__contains__has_keyskeys__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