2012-11-27 51 views
7

谷歌appengine的webapp2有一個非常神祕的documentation regarding the handling of uploaded files如何處理上傳的文件在webapp2

Uploaded files are available as cgi.FieldStorage (see the cgi module) instances directly in request.POST. 

我有一個表單,它使我想存儲在NDB.JsonProperty中的JSON文件的POST請求。

任何人都可以提供一個簡短的例子,我如何從請求對象讀取文件?

+0

POST是否編碼爲'application/x-www-form-urlencoded'或'multipart/form-data'? –

+0

類似的問題:http://stackoverflow.com/questions/6846333/how-does-cgi-fieldstorage-store-files –

+0

Martijn:我正在使用multipart/form-data,我應該使用其他類型嗎? – fccoelho

回答

0

代替使用在How does cgi.FieldStorage store files?描述的解決方案的,我使用的enctype =形式爲「多部分/格式數據」,和

在爲後處理程序方法我經由訪問的文件:

file_content = self.request.POST.multi['myfieldname'].file.read() 

它的工作!

+0

我必須將JsonProperty的值定義爲在模型中壓縮,否則我會得到一個錯誤,因爲它太大了...... – fccoelho

7

您可以在表單中使用enctype="multipart/form-data",然後通過使用您的處理程序獲得文件內容:

raw_file = self.request.get('field_name') 

然後,raw_file通過輸入到模型中的財產。

+0

這對我有用,它傳遞迴整個文件。 –

4

Google的文檔很糟糕。我花了大約兩個小時試驗了webapp2的請求對象,並最終找出了一個方法來做到這一點。

檢查https://stackoverflow.com/a/30969728/2310396

基本的代碼片段是在這裏:

class UploadHandler(BaseHandler): 
    def post(self): 
     attachments = self.request.POST.getall('attachments') 

     _attachments = [{'content': f.file.read(), 
         'filename': f.filename} for f in attachments] 

我們使用self.request.POST.getall('attachments')代替self.request.POST.get('attachments'),因爲他們可能會在具有相同名稱的HTML表單多個input領域,所以如果你只是用self.request.POST.get('attachments'),你會只有其中一個。

+1

請注意,此解決方案假定您的表單中有一個名爲'attachments'的表單域。這不是一個神奇的webapp2關鍵字或任何東西。 – Sam