如何在谷歌应用引擎上使用html5上传多文件(python)

发布于 2024-10-05 00:17:53 字数 3039 浏览 0 评论 0原文

这是我的代码,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 获取多个文件?

谢谢

上传

现在可以了,请按照这篇文章操作:使用 Google 应用引擎接收多文件帖子

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)

this is my code, the 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,))

and the index.html is :

<form enctype="multipart/form-data" action="/" method="post">
  <input type="file" name="file" multiple="true" />
  <input type="submit" />
</form>

you can use file = self.request.POST['file'] to get one file , but using html5 muti file ,

how to get muti file using python when post ?

thanks

upload

it is ok now , Follow this article: Receive multi file post with google app engine

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)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

病毒体 2024-10-12 00:17:53

您可能想为此使用 blobstore 服务;我写了一系列帖子(123) 介绍如何使用上传小部件将多个文件上传到 blobstore。

You probably want to use the blobstore service for this; I wrote a series of posts (1, 2, 3) covering how to do multiple-file upload to the blobstore, using an upload widget.

一世旳自豪 2024-10-12 00:17:53

AFAIK, request.POST['file'] 应该是一个文件字典,即 POST['file'] 应该有键作为上传文件的名称和value 应该分别是文件的内容,即 POST['file']['avatar.png'] = ... # raw image data

我不知道GAE HTTP Request类提供的功能是什么,但应该与此一致。不管怎样,它肯定self.request的某个地方!

编辑:

好的,我刚刚注意到 GAE 为您创建了一个文件对象,我的猜测是这应该有效:

for file in POST['file']:
    obj = MyModel(data=file.value, mimetype=file.type)
    obj.put()

AFAIK, the request.POST['file'] should be a dictionary of files, i.e. POST['file'] should have keys as names of the files uploaded and the value should be the contents of the files respectively, i.e. POST['file']['avatar.png'] = ... # raw image data.

I don't know what's the functionality provided by the GAE HTTP Request class, but it should be consistent to this. Whatever the case, it's definitely in self.request, somwhere!

EDIT:

Ok, I just noticed GAE creates a file object for you, my guessing is this should work:

for file in POST['file']:
    obj = MyModel(data=file.value, mimetype=file.type)
    obj.put()
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文