2012-11-27 31 views
7

webapp2 của Google appengine có một số rất khó hiểu documentation regarding the handling of uploaded files.Cách xử lý các tệp đã tải lên trong webapp2

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

Tôi có một biểu mẫu yêu cầu POST các tệp JSON mà tôi muốn lưu trữ trong NDB.JsonProperty.

Có ai có thể cung cấp ví dụ ngắn về cách đọc tệp từ đối tượng yêu cầu không?

+0

POST có được mã hóa là 'application/x-www-form-urlencoded' hoặc 'multipart/form-data' không? –

+0

câu hỏi tương tự: http://stackoverflow.com/questions/6846333/how-does-cgi-fieldstorage-store-files –

+0

Martijn: Tôi đang sử dụng multipart/form-data, tôi có nên sử dụng loại khác không? – fccoelho

Trả lời

0

Thay vì sử dụng các giải pháp được mô tả trong How does cgi.FieldStorage store files?, tôi sử dụng enctype = "multipart/form-data" trong biểu mẫu, và

trong phương pháp xử lý đối với những bài tôi truy cập các tập tin thông qua:

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

nó đã hoạt động!

+0

Tôi đã phải xác định các giá trị JsonProperty như được nén trong Mô hình, nếu không tôi sẽ gặp lỗi khi đặt quá lớn ... – fccoelho

7

Bạn có thể sử dụng enctype="multipart/form-data" trong mẫu của bạn, và sau đó nhận được nội dung tập tin bằng cách sử dụng trong xử lý của bạn:

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

Sau đó, vượt qua raw_file như là đầu vào đối với tài sản của mô hình của bạn.

+0

điều này làm việc cho tôi, nó sẽ trả về toàn bộ tệp. –

4

Tài liệu của Google chỉ hút. Tôi đã dành khoảng hai giờ thử nghiệm với đối tượng yêu cầu của webapp2 và cuối cùng con số ra một cách để làm điều này.

Kiểm tra https://stackoverflow.com/a/30969728/2310396.

Các đoạn mã cơ bản là ở đây:

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

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

Chúng tôi sử dụng self.request.POST.getall('attachments') thay vì self.request.POST.get('attachments'), kể từ khi họ có thể có nhiều input trường trong các hình thức HTML có cùng tên, vì vậy nếu bạn chỉ cần sử dụng self.request.POST.get('attachments'), bạn sẽ chỉ nhận được một trong số họ.

+1

Lưu ý rằng giải pháp này giả định rằng bạn có một trường biểu mẫu được gọi là 'tệp đính kèm' trong biểu mẫu của bạn. Nó không phải là một từ khóa webapp2 ma thuật hay bất cứ điều gì. – Sam

Các vấn đề liên quan