2010-08-04 3 views
3

Я пытаюсь связать видеофайл с записью с кучей свойств, но, похоже, не может позволить пользователю делать все в одной форме - назвать видео, предоставить описание и ответ на какой-то вопрос, И загрузить файл.Загрузка видео в google app engine blobstore

Вот шаги, которые я хотел бы выполнить:

  1. Пользователь служившие со страницей, содержащей форму со следующими полями: имя, описание, селектор файлов.
  2. Файл сохраняется в виде блоба, и идентификатор записывается вместе с именем и описанием.

Есть ли у кого-нибудь примеры этого, чему я мог бы научиться, или учебник, на который вы могли бы указать мне? Один из Google показывает только загрузку файла и перенаправление на него.

Спасибо и извините за новый вопрос!

ответ

3

Вот код, который я использую для загрузки изображений и связывания их со статьями. Самый сложный бит получал идентификатор статьи, чтобы добраться до обработчика загрузки, я решил его, установив имя файла как идентификатор статьи, чтобы обойти проблему.

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/

+0

Спасибо! Можете ли вы дать мне немного больше контекста для этого (больше вопросов о нобе) - вы используете webapp или django? – Sologoub

+0

Я использую django-nonrel. Поскольку я уже привык к джанго, это был самый простой способ сделать это, потому что мне не нужно было изучать webapp. Также есть некоторые импортные и такие вещи, отсутствующие в вставленном мной коде, пытались дать только соответствующие биты :) –

+0

Звучит неплохо. Спасибо! Поскольку мне не хватает опыта, я просто хотел удостовериться, что могу обратиться к дополнительным документам, чтобы лучше понять это. – Sologoub

5
+0

Большое спасибо! – Sologoub

+0

Кстати, для пояснения для тех, кто смотрит на эти примеры, этот JAVA – Sologoub

+0

хорошо, я могу загрузить файл изображения с 3,4 МБ с помощью [this] (http://demofileuploadgae.appspot.com/), я сомневаюсь, что он следующий тот же источник, который связан –

1

Вот как я это сделал. Это более прямолинейно, чем вы думаете. Обратите внимание на следующее, взятое из Blobstore overview. «Когда Blobstore перезаписывает запрос пользователя, части MIME загруженных файлов очищаются, а клавиша 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) 
Смежные вопросы