2011-12-06 9 views
0

私がやっていることは、ファイルを私たちのストレージシステムにアップロードするためのアップロードボタンがあることです。私はPythonでGoogle App Engineを使用しています。ビューのHTMLとJavascript。そのためにGoogle App Engineの.jsファイルが存在するかどうかDBに問い合わせる方法

、我々はHTMLを持っている、と彼はファイルを上書きしたいことを確認します場合は、ユーザーに尋ねるa.js。その上書き質問については、私はそれが存在するかどうかを知るために、データベースを依頼する必要があり、そして質問が尋ねするかどうそう...

事は私もどこから始めれば分からないです。私は、このconfirm()テキストをユーザに表示し、GQLデータベースを持っていますが、質問をする方法はわかりません。例えば、私はURLを使ってアップロードしますが、私はそのためのレスポンスを持っていませんし、URLを介してデータベースに質問(ファイルの名前など)を渡したくありません...

私はどのような経路を追うべきですか?私は何かを不可能にしようとしているのか、全く意味がないのか?

ありがとうございます!

私はいくつかのコードを追加します。

これは我々がファイルをアップロードするユーザーを尋ねるHTMLフォームです:

<form id="up_file" enctype="multipart/form-data" method="post"> 
       <input type="hidden" name="user_id" value="{{ current_user.id }}"/> 
       <input type="hidden" name="group_id" value="{{ group.id }}"/> 
       <p>File: <input type="file" name="filename" id="file_name"/></p> 
       <p><input type="button" value="Upload" onClick="seguro_sobreescribir(filename,{{ current_user.id }},{{ group.id }})"/></p> 
      </form> 

、これは現在では我々のアプリケーションに情報を送信しようとしたJavaScriptです

function Request(function_name, opt_argv) { 
    if (!opt_argv) 
    opt_argv = new Array(); 

    // Find if the last arg is a callback function; save it 
    var callback = null; 
    var len = opt_argv.length; 
    if (len > 0 && typeof opt_argv[len-1] == 'function') { 
    callback = opt_argv[len-1]; 
    opt_argv.length--; 
    } 
    var async = (callback != null); 

    // Build an Array of parameters, w/ function_name being the first parameter 
    var params = new Array(function_name); 
    for (var i = 0; i < opt_argv.length; i++) { 
    params.push(opt_argv[i]); 
    } 
    var body = JSON.stringify(params); 

    // Create an XMLHttpRequest 'POST' request w/ an optional callback handler 
    var req = new XMLHttpRequest(); 

    req.open('POST', 'https://safeshareapp.appspot.com/upload', async); 

    req.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); 
    req.setRequestHeader("Content-length", body.length); 
    req.setRequestHeader("Connection", "close"); 

    if (async) { 
    req.onreadystatechange = function() { 
     if(req.readyState == 4 && req.status == 200) { 
     var response = null; 
     try { 
     response = JSON.parse(req.responseText); 
     } catch (e) { 
     response = req.responseText; 
     } 
     callback(response); 
     } 
    } 
    } 

    // Make the actual request 
    req.send(body); 
} 


// Comprobar si existe, y si existe, preguntar si se quiere sobreescribir 
function seguro_sobreescribir(filename,user_id,group_id) 
{ 

     var resp=confirm("Seguro que quiere sobreescribir el archivo "+filename.value+" del usuario "+user_id+" del grupo "+group_id+"?");  

     if(resp) 
     {   
      var result = Request('Upload',[filename,user_id,group_id]); 
      alert("Hemos hecho request "+ result); 
     }  

} 

そして、これが私たちの要求を処理するのRequestHandlerである:誰かがアップロードボタンをクリックすると、Googleのエンジン

class RPCHandler(webapp.RequestHandler): 
    """ Allows the functions defined in the RPCMethods class to be RPCed.""" 
    def __init__(self): 
     webapp.RequestHandler.__init__(self) 
     self.methods = RPCMethods() 

    def post(self): 

     args = simplejson.loads(self.request.body) 
     func, args = args[0], args[1:] 

     if func[0] == '_': 
      self.error(403) # access denied 
      return 

     func = getattr(self.methods, func, None) 
     if not func: 
      self.error(404) # file not found 
      return 

     result = func(*args) 
     self.response.out.write(simplejson.dumps(result)) 

class RPCMethods: 

    def Upload(self, *args): 

     status = -1 
     fileitem = args[0]   
     userid = args[1] 
     groupid=args[2]  

     return status 

def main(): 
    app = webapp.WSGIApplication([('/upload', RPCHandler)], debug=True) 
    util.run_wsgi_app(app) 

if __name__ == '__main__': 
    main() 

実際、戻りステータスはJavaScriptで未定義の状態になっています。 ファイルをアップロードしていないかどうかわかりません。私たちは一緒に置く方法がわからない2つのことがあるのでそれがあります:

  • 通常の「入力タイプ=ファイル、方法=ポスト、および入力タイプを提出= HTMLフォームの送信ボタンを

  • GoogleのアプリエンジンへのRequestHandlerを経由して私たちの接続など

あなたが任意のアイデア

+0

Pythonフレームワーク(例:django、web2py ...)を使用していますか?また、そこに手伝ってくれるツールもあります。 – JMax

+0

いいえ、JMax、私たちはちょうど短いプロジェクトで、開始前にDjangoの驚異を知らなかったので、通常のGoogleアプリケーションエンジンとPythonをhtmlとjavascriptで使用しています:D – c4sh

+0

どのようにファイルを格納し整理していますか?ファイル名の保存方法に応じて、ファイル名を一意の制約にする必要はありません。あなたの質問に対する答えは、物事をどのように保管し整理しているかによってまったく異なります。 –

答えて

1

を持っています。ここ可能性があります:

ファイル名を指定して質問に答えるサーブレットを実装します。ファイルが存在するかどうかに応じて、HTTP応答として '0'または '1'(またはあなたが選択したもの)を返すことができます。次に、POSTパラメータとしてファイル名を使用して、JavaScriptからサーブレットへのXmlHttpRequest POSTを行います。 XmlHttpRequestの戻り値に応じて、確認を求めるユーザーにUIを表示します。

+0

それは私が望むように見えます。しかし、私はどのようにPythonバージョンのGoogle App Engineでサーブレットを実装できますか? – c4sh

+0

Pythonでは、RequestHandlerを実装します。ここをクリックしてください:http://code.google.com/appengine/docs/python/gettingstarted/usingwebapp.html サーブレットの「取得」に加えて(またはその代わりに)「投稿」を実装したいと思うでしょうこのパスを処理します。 –

1

blobstoreを使用してファイルをGAEに保存していますか?

もしそうなら、各ブロブストアエンティティはプロパティファイル名を持ちます。フォームをblobstoreハンドラに送信する前に、BlobInfoを使用してそのファイル名のクエリを実行してください。"サーブレット"の場合、送信されるファイル名に応じて0または1を出力するリクエストハンドラを書くことができます。

さらに、そのファイル名を持つユーザー/組織ごとに1つのファイルのみが必要な場合は、アップロードされたファイルと対応するユーザー/組織のリストを別々に保存して代わりに照会することができます。

関連する問題