Как спросить БД, существует ли файл из .js в Google App Engine - PullRequest
0 голосов
/ 06 декабря 2011

что я пытаюсь сделать - это загрузить кнопку для загрузки файлов в нашу систему хранения.Я использую Google App Engine с Python.Также HTML и Javascript для представлений.

Для этого у нас есть HTML и a.js, который спрашивает пользователя, уверен ли он, что хочет перезаписать файл.Для этого перезаписывающего вопроса мне нужно попросить базу данных узнать, существует ли она, и поэтому, если вопрос следует задавать или нет ...

Дело в том, что я даже не знаю, с чего начать.У меня есть этот текст подтверждения (), показанный пользователю, и база данных GQL, но я не знаю, как задать вопрос.Например, я загружаю через URL, но тогда у меня нет ответа на него, а также я не хочу передавать вопрос (имя файла, ...) в базу данных через URL ...

Ты хоть представляешь, по какому пути мне идти?Я пытаюсь сделать что-то невозможное или бессмысленное?

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

Я добавляю код:

Это HTML-форма, где мы просим пользователя загрузитьfile:

<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, который в данный момент пытается отправить информацию в наше приложение в движке Google, когда кто-то нажимает кнопку загрузки:

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, которыйдолжен обработать наш запрос:

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 вещи, которые мы не знаем, как соединить:

  • Обычный тип ввода = file, method = post и тип ввода input = кнопка submitHTML-форма

  • Наше подключение через RequestHandler к движку приложений Google и т. Д.

У вас есть идеи?

Ответы [ 2 ]

1 голос
/ 06 декабря 2011

Используете ли вы blobstore для хранения файлов в GAE?

Если это так, у каждого объекта blobstore есть имя файла свойства.Прежде чем отправить форму в обработчик хранилища, выполните запрос по этому имени файла с помощью BlobInfo.gql (query_string, * args, ** kwds): http://code.google.com/appengine/docs/python/blobstore/blobinfoclass.html#BlobInfo_gql

Для «сервлета» вы можете просто написатьобработчик запроса, который будет выводить 0 или 1 в ответ на переданное имя файла.

Кроме того, если вам нужен только один файл на пользователя / организацию с таким именем, вы можете сохранить отдельный список загруженных файлов.файлы и соответствующие пользователи / организации и запросите это вместо этого.

1 голос
/ 06 декабря 2011

Вот такая возможность:

Реализация сервлета, который может ответить на вопрос по заданному имени файла;он может возвратить «0» или «1» (или что вы выберете) в качестве ответа HTTP в зависимости от того, существует ли файл.Затем сделайте POST XmlHttpRequest для этого сервлета из вашего javascript с именем файла в качестве параметра POST.В зависимости от возврата XmlHttpRequest, покажите пользовательский интерфейс пользователю, запрашивающему подтверждение.

...