2013-06-22 64 views
0

在回答this question時,我遇到了一些奇怪的行爲,GAE從表單POST中處理文件上傳。爲什麼GAE中的POST文件上傳無法訪問cgi.Fieldstorage方法?

問題一:除非我誤會,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中正常工作,我只是不知道如何使用它們?

回答

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 e.t.c,所以方法__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

+0

很好的答案,謝謝!現在完成了,因爲我唯一的測試涉及單個文件。 Facepalmed自己。 – rGil

相關問題