如何在Google App Engine (Python)中使用HTML5上传多个文件
这是我的代码,upload.py:
class MyModel(db.Model):
data = db.BlobProperty(required=True)
mimetype = db.StringProperty(required=True)
class BaseRequestHandler(webapp.RequestHandler):
def render_template(self, filename, template_args=None):
if not template_args:
template_args = {}
path = os.path.join(os.path.dirname(__file__), 'templates', filename)
self.response.out.write(template.render(path, template_args))
class upload(BaseRequestHandler):
def get(self):
self.render_template('index.html',)
def post(self):
file = self.request.POST['file']
obj = MyModel(data=file.value, mimetype=file.type)
obj.put()
o=file
#self.response.out.write(''.join('%s: %s <br/>' % (a, getattr(o, a)) for a in dir(o)))
#return
file_url = "http://%s/download/%d/%s" % (self.request.host, obj.key().id(), file.filename)
self.response.out.write("Your uploaded file is now available at <a href='%s'>%s</a>" % (file_url,file_url,))
还有index.html是:
<form enctype="multipart/form-data" action="/" method="post">
<input type="file" name="file" multiple="true" />
<input type="submit" />
</form>
你可以用 file = self.request.POST['file']
来获取一个文件,但如果使用HTML5的多文件上传,
那么在用Python处理POST请求时,怎么才能获取多个文件呢?
谢谢
上传
现在已经解决了,参考这篇文章: 使用Google App Engine接收多个文件的POST请求
class Download_file(db.Model):
data = db.BlobProperty(required=True)
mimetype = db.StringProperty(required=True)
download_url = db.StringProperty()
class BaseRequestHandler(webapp.RequestHandler):
def render_template(self, filename, template_args=None):
if not template_args:
template_args = {}
path = os.path.join(os.path.dirname(__file__), 'templates', filename)
self.response.out.write(template.render(path, template_args))
class upload(BaseRequestHandler):
def get(self):
files=Download_file.all()
self.render_template('index.html',{'files':files})
def post(self):
files = self.request.POST.multi.__dict__['_items']
#self.response.out.write(files)
for file in files:
file=file[1]
obj = Download_file(data=file.value, mimetype=file.type)
obj.put()
file_url = "http://%s/download/%d/%s" % (self.request.host, obj.key().id(), file.filename)
file_url = "<a href='%s'>%s</a>" % (file_url,file_url,)
obj.download_url=file_url
obj.put()
self.response.out.write("Your uploaded file is now available at %s </br>" % (file_url))
class download(BaseRequestHandler):
def get(self,id,filename):
#id=self.request.get('id')
entity = Download_file.get_by_id(int(id))
self.response.headers['Content-Type'] = entity.mimetype
self.response.out.write(entity.data)
2 个回答
1
据我所知,request.POST['file']
应该是一个文件字典,也就是说,POST['file']
的键是上传文件的名字,值则是文件的内容。比如说,POST['file']['avatar.png'] = ... # 原始图片数据
。
我不太清楚GAE的HTTP请求类提供了什么功能,但它应该和这个一致。不管怎样,这个信息肯定在self.request
里面,某个地方!
编辑:
好的,我刚注意到GAE会为你创建一个文件对象,我猜这个应该可以工作:
for file in POST['file']:
obj = MyModel(data=file.value, mimetype=file.type)
obj.put()