2012-05-08 84 views
0

我正在编写一个应用程序,允许用户上传视频到我的网站,所以我可以编辑它们并将它们发回给他们。我正在使用谷歌应用程序引擎和Python。我已经阅读了关于blob和东西,但我认为仍然需要一点进一步的解释。Google App Engine,上传视频,python

它是如何工作的?

我写了一些使用谷歌blob示例代码的代码,所以它好像文件正在上传。但是,我不知道如何访问它们。我甚至不知道他们在哪里得救。

这里是我的形式

<form method="POST" action="%s" enctype="multipart/form-data"> 
    Upload file: <input type="file" name="file" /><br /> 
    </br> 
    <input type="submit" name="Submit" value="Submit"/> 
    </form> 

,这里是我的处理程序:

import os 
os.environ['DJANGO_SETTINGS_MODULE'] = 'settings' 
from google.appengine.dist import use_library 
use_library('django', '1.2') 

import os 
import logging 
import cgi 
import datetime 
import urllib 
import wsgiref.handlers 
from google.appengine.ext import webapp 
from google.appengine.ext.webapp import template 
from util.sessions import Session 
from google.appengine.ext import db 
from google.appengine.api import users 
from google.appengine.ext import blobstore 
from google.appengine.ext.webapp import blobstore_handlers 

# A Model for a User 
class User(db.Model): 
    account = db.StringProperty() 
    password = db.StringProperty() 
    name = db.StringProperty() 

# A helper to do the rendering and to add the necessary 
# variables for the _base.htm template 
def doRender(handler, tname = 'index.html', values = { }): 
    logging.info('doRender(' + tname + ')') 
    temp = os.path.join(
     os.path.dirname(__file__), 
     'templates/' + tname) 
    logging.info(temp) 
    if not os.path.isfile(temp): 
    return False 

    # Make a copy of the dictionary and add the path and session 
    newval = dict(values) 
    newval['path'] = handler.request.path 
    handler.session = Session() 
    if 'username' in handler.session: 
    newval['username'] = handler.session['username'] 
    logging.info(newval) 
    outstr = template.render(temp, newval) 
    handler.response.out.write(outstr) 
    return True 


class LoginHandler(webapp.RequestHandler): 

    def get(self): 
    doRender(self, 'login.html') 

    def post(self): 
    self.session = Session() 
    acct = self.request.get('account') 
    pw = self.request.get('password') 
    logging.info('Checking account='+acct+' pw='+pw) 

    self.session.delete_item('username') 
    self.session.delete_item('userkey') 

    if pw == '' or acct == '': 
     doRender(
      self, 
      'login.html', 
      {'error' : 'Please specify Account and Password'}) 
     return 

    que = db.Query(User) 
    que = que.filter('account =',acct) 
    que = que.filter('password = ',pw) 

    results = que.fetch(limit=1) 

    if len(results) > 0 : 
     user = results[0] 
     self.session['userkey'] = user.key() 
     self.session['username'] = acct 
     doRender(self,'index.html',{ }) 
    else: 
     doRender(
      self, 
      'login.html', 
      {'error' : 'Incorrect password'}) 

class AddUserHandler(webapp.RequestHandler): 

    def get(self): 
    doRender(self, 'adduser.html') 

    def post(self): 
    self.session = Session() 
    name = self.request.get('name') 
    acct = self.request.get('account') 
    pw = self.request.get('password') 
    logging.info('Adding account='+acct) 

    if pw == '' or acct == '' or name == '': 
     doRender(
      self, 
      'adduser.html', 
      {'error' : 'Please fill in all fields'}) 
     return 

    # Check if the user already exists 
    que = db.Query(User).filter('account =',acct) 
    results = que.fetch(limit=1) 

    if len(results) > 0 : 
     doRender(
      self, 
      'adduser.html', 
      {'error' : 'Account Already Exists'}) 
     return 

    # Create the User object and log the user in 
    newuser = User(name=name, account=acct, password=pw); 
    pkey = newuser.put(); 
    self.session['username'] = acct 
    self.session['userkey'] = pkey 
    doRender(self,'index.html',{ }) 

class LogoutHandler(webapp.RequestHandler): 

    def get(self): 
    self.session = Session() 
    self.session.delete_item('username') 
    self.session.delete_item('userkey') 
    doRender(self, 'index.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] 
     self.redirect('/serve/%s' % blob_info.key()) 

class ServeHandler(blobstore_handlers.BlobstoreDownloadHandler): 
    def get(self, resource): 
     resource = str(urllib.unquote(resource)) 
     blob_info = blobstore.BlobInfo.get(resource) 
     self.send_blob(blob_info) 

class MainHandler(webapp.RequestHandler):   

    def get(self): 
    if doRender(self,self.request.path) : 
     return 
    doRender(self,'index.html') 

def main(): 
    application = webapp.WSGIApplication([ 
    ('/login', LoginHandler), 
    ('/add-user', AddUserHandler), 
    ('/logout', LogoutHandler), 
    ('/upload', UploadHandler), 
    ('/serve/([^/]+)?',ServeHandler), 
    ('/.*', MainHandler)], 
    debug=True) 
    wsgiref.handlers.CGIHandler().run(application) 

if __name__ == '__main__': 
    main() 

有人可以帮我想出解决办法?此外,有没有任何选项可以将这些文件直接保存在我的谷歌驱动器或保管箱?

感谢您的帮助

+0

您是否尝试过google搜索 “App Engine的Blob存储”或“Google Drive API”?你可能会发现一些有用的结果... –

+0

正如我所说,我确实使用谷歌应用程序引擎blobstore的代码,我不会问以前做一些研究的问题。谢谢你的帮助tho –

+0

什么是你的问题?不要只是给我们一层代码,问一些模糊的东西,比如“有人能帮我解决这个问题吗?”,我们不知道你想弄清楚什么。 –

回答

1

您可以使用BlobReader类表现得像一个Python文件对象访问Blob存储文件数据。

例如:

upload_files = self.get_uploads('file') 
blob_info = upload_files[0] 
f = blob_info.open() # Return a BlobReader 
content = f.read() # Read the entire file content into memory 

可以使用Drive SDK保存在谷歌云端硬盘文件,你可以找到谷歌App Engine的一个示例应用程序here

+0

所以我应该如何在我的电脑上访问它?抱歉,我从来没有写过一个应用程序来管理文件。 –

+0

blobstore文件托管在App Engine上,您可以使用您在问题中发布的'ServeHandler'服务它们。 – proppy

+0

更新了我对有关Google云端硬盘问题的回答。 – proppy