【问题标题】:Uploading a video to google app engine blobstore将视频上传到 google app engine blobstore
【发布时间】:2011-03-25 11:23:40
【问题描述】:

我正在尝试将视频文件与具有一堆属性的记录相关联,但似乎不允许用户以一种形式完成所有操作 - 为视频命名、提供描述并回答一些问题,然后上传文件。

以下是我想要执行的步骤:

  1. 为用户提供一个页面,该页面包含一个包含以下字段的表单:名称、描述、文件选择器。
  2. 文件以 blob 形式存储,id 与名称和描述一起记录。

有没有人有任何我可以学习的例子或者你可以指点我的教程?来自谷歌的那个只显示上传文件并被重定向到它。

感谢和抱歉提出一个新问题!

【问题讨论】:

    标签: python google-app-engine blobstore


    【解决方案1】:

    这就是我的做法。它比你想象的更直接。请注意以下来自Blobstore overview 的内容。 “当 Blobstore 重写用户的请求时,上传文件的 MIME 部分的 body 被清空,并将 blob 键添加为 MIME 部分标头。所有其他表单字段和部分都保留并传递给上传处理程序。” 在上传处理程序中,您可以对其他表单字段执行任何操作。

        class Topic(db.Model):
            title = db.StringProperty(multiline=False)
            blob = blobstore.BlobReferenceProperty()
            imageurl = db.LinkProperty()
    
        class MainHandler(webapp.RequestHandler):
            def get(self):
                upload_url = blobstore.create_upload_url('/upload')
                self.response.out.write('<html><body>')
                self.response.out.write('<form action="%s" method="POST" enctype="multipart/form-data">' % upload_url)
                self.response.out.write("""Upload File: <input type="file" name="file"><br>
                <div><label>Title:</label></div>
                <div><textarea name="title" rows="1" cols="25"></textarea></div><input type="submit" 
                    name="submit" value="Submit"> </form>""")
                self.response.out.write('<br><br><h2>TOPIC LIST</h2><table border="1"><tr><td>')
                for topic in Topic.all():                
                    self.response.out.write('<div><img src="%s=s48"/>' % topic.imageurl)
                    self.response.out.write('<div><b>Image URL: </b><i>%s</i></div>' % topic.imageurl)
                    self.response.out.write('<div><b>Title: </b><i>%s</i></div>' % topic.title)
                self.response.out.write('</td></tr></table><br>') 
                self.response.out.write('</body></html>')
    
        class UploadHandler(blobstore_handlers.BlobstoreUploadHandler):
            def post(self):
                upload_files = self.get_uploads('file')  # 'file' is file upload field in the form
                blob_info = upload_files[0]
                topic = Topic()
                topic.title = self.request.get("title")
                topic.blob = blob_info.key()
                topic.imageurl = images.get_serving_url(str(blob_info.key()))
                topic.put()        
                self.redirect('/')
    def main():
        application = webapp.WSGIApplication(
              [('/', MainHandler),
               ('/upload', UploadHandler),
              ], debug=True)
        run_wsgi_app(application)
    

    【讨论】:

      【解决方案2】:

      【讨论】:

      • 顺便说一下,为了让那些看这些例子的人澄清一下,这个是 JAVA
      • 我可以使用 this 上传 3.4 MB 的图像文件,我怀疑它是否遵循链接的相同来源
      【解决方案3】:

      这是我用来上传图片并将它们与文章相关联的代码。最困难的一点是让文章 id 到达上传处理程序,我通过将文件名设置为文章 id 来解决这个问题。

      from lib import urllib2_file
      from lib.urllib2_file import UploadFile
      
      # this view serves a task in a queue
      def article(request):
             article = Article.objects.get(id=form.cleaned_data['article'])
      
             try:
                  image = StringIO(urllib2.urlopen(image_url).read())
              except (urllib2.HTTPError, DownloadError):
                  article.parsed = True
                  article.save()
              else:
                  image = UploadFile(image, '.'.join([str(article.id), image_url.rsplit('.', 1)[1][:4]]))
                  upload_url = blobstore.create_upload_url(reverse('Articles.views.upload'))
      
                  try:
                      urllib2.urlopen(upload_url, {'file': image})
                  except (DownloadError, RequestTooLargeError):
                      pass
      
          return HttpResponse(json.dumps({'status': 'OK'}))
      
      def upload(request):
          if request.method == 'POST':
              blobs = get_uploads(request, field_name='file', populate_post=True)
      
              article = Article.objects.get(id=int(blobs[0].filename.split('.')[0]))
              article.media = blobs[0].filename
              article.parsed = True
              article.save()
      
              return HttpResponseRedirect(reverse('Articles.views.upload'))
          else:
              return HttpResponse('meow')
      
          def upload(request):
              if request.method == 'POST':
                  blobs = get_uploads(request, field_name='file', populate_post=True)
      
                  article = Article.objects.get(id=int(blobs[0].filename.split('.')[0]))
                  article.media = blobs[0].filename
                  article.parsed = True
                  article.save()
      
                  return HttpResponseRedirect(reverse('Articles.views.upload'))
              else:
                  return HttpResponse('meow')
      
      # this serves the image
      def image(request):
          blob = BlobInfo.gql("WHERE filename='%s' LIMIT 1" % request.form.cleaned_data['id'])[0]
      
          return HttpResponse(BlobReader(blob.key()).read(),
                              content_type=blob.content_type)
      

      你还需要这个http://fabien.seisen.org/python/urllib2_file/

      【讨论】:

      • 谢谢!你能给我更多的背景信息吗(更多的菜鸟问题)——你使用的是 webapp 还是 django?
      • 我正在使用 django-nonrel。因为我已经习惯了 django,所以这是最简单的方法,因为我不必学习 webapp。我粘贴的代码中还缺少一些导入和此类内容,试图仅提供相关位:)
      • 听起来不错。谢谢!由于我缺乏经验,我只是想确保我可以参考一些额外的文档以更好地理解它。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-02-07
      • 1970-01-01
      • 2020-11-24
      • 2013-06-27
      • 2015-01-21
      • 1970-01-01
      • 2020-03-09
      相关资源
      最近更新 更多