2013-03-24 66 views
0

使用GAE「helloworld」示例應用程序作爲基礎,但將「helloworld.py」更改爲:對於<input type =「file」...> self.request.POST [name]只是一個字符串

import webapp2 

class MainPage(webapp2.RequestHandler): 
    def get(self): 
     self.response.headers['Content-Type'] = 'text/html' 
     self.response.write(
      """ 
      <form method="post"> 
       UPLOAD: <input type="file" name="file_param"/> 
       <br/> 
       <input type="submit" name="submit_param" value="Submit"> 
      </form> 
      """ 
     ) 

    def post(self): 
     field_storage = self.request.POST["file_param"] 
     try: 
      mimetype = field_storage.type 
      self.response.write("Mimetype: {}".format(mimetype)) 
     except: 
      self.response.write("No FieldStorage object, field_storage={}".format(field_storage))  

app = webapp2.WSGIApplication([('/', MainPage)], debug=True) 

運行此谷歌瀏覽器在Mac OSX:

  1. 點擊 「選擇文件」
  2. 選擇要上傳的文件
  3. 點擊 「提交」

該回來的網頁顯示:

No FieldStorage object, field_storage=<the name of the file I uploaded> 

根據不同崗位http://webapp-improved.appspot.com/guide/request.html#files和實例,self.request.POST[name]應該是cgi.FieldStorage對象。但是,如本例所示,self.request.POST[name]是一個包含上傳文件的文件名的字符串。如果它是一個cgi.FieldStorage對象,我希望程序顯示上傳文件的MIME類型。

我需要cgi.FieldStorage對象,這樣我就可以獲得mimetype,當然還有值,也就是文件的內容。我究竟做錯了什麼?

順便說一下,從webapp2切換到webapp(使用from google.appengine.ext import webapp)沒有什麼區別。另外,在Safari或Firefox中運行它,其表現與Chrome中相同。

回答

1

窗體的enctype必須是multipart/form-data。請添加它如下(方法屬性是不區分大小寫):

<form method="POST" enctype="multipart/form-data"> 

另外,請考慮使用blobstore upload,因爲它沒有大小限制,也可以use Google Cloud Storage as a backend,這將給你的ACL更多的靈活性和分享能力。

+0

謝謝!我的示例適用於該更改。 Q1。在使用POST時,您的想法是什麼?因爲它使用小寫字母? Q2。爲什麼使用Blobstore優先於數據存儲BlobProperty(我不明白從文檔中)? – Lindsay 2013-03-24 12:33:36

+0

更新了我的答案 – 2013-03-24 15:09:24

相關問題