使用GAE" helloworld"示例应用程序作为基础,但更改" helloworld.py"到:
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上的Google Chrome中运行:
回来的页面说:
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对象,我希望程序显示上传文件的mimetype。
我需要cgi.FieldStorage对象,所以我可以获取mimetype,当然还有值,即文件的内容。我做错了什么?
顺便说一下,从webapp2切换到webapp(使用from google.appengine.ext import webapp
)没有任何区别。此外,在Safari或Firefox中运行它,其行为与Chrome中的相同。
答案 0 :(得分:1)
表单enctype
必须为multipart/form-data
。请按如下方式添加(方法属性不区分大小写):
<form method="POST" enctype="multipart/form-data">
此外,请考虑使用blobstore upload,因为它没有大小限制,您还可以use Google Cloud Storage as a backend,这将为您提供更多ACL和共享功能的灵活性。