如何询问数据库,如果一个文件存在从一个.js在谷歌应用引擎
How to ask the DB if a file exists from a .js in Google App Engine
我想做的是有一个上传按钮来上传文件到我们的存储系统。我使用谷歌应用程序引擎与Python。还有HTML和Javascript用于视图。
为此,我们有一个HTML和a.js,询问用户是否确定要覆盖一个文件。对于那个覆盖问题,我需要让数据库知道它是否存在,以及是否应该问这个问题…
问题是我甚至不知道从哪里开始。我有这个确认()文本显示给用户,和一个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>
当有人点击上传按钮时,这是当前尝试向Google引擎中的应用程序发送信息的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:
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中给了我们一个未定义的返回。我们不知道我们是否没有上传文件,如果是,如何上传。这是因为我们有两件事我们不知道如何放在一起:
HTML表单中普通的"input type=file, method=post, submit input type=submit"按钮
我们通过RequestHandler连接到google应用引擎等
你有什么想法吗?
有可能:
实现一个servlet,可以回答给定文件名的问题;它可以返回'0'或'1'(或任何你选择的)作为它的HTTP响应,这取决于文件是否存在。然后用文件名作为POST参数,从javascript向该servlet发送XmlHttpRequest POST。根据XmlHttpRequest的返回,向用户显示要求确认的UI。
您是否使用blobstore在GAE上存储文件?
如果是,每个blobstore实体都有一个属性filename。在将表单提交给blobstore处理程序之前,使用BlobInfo对该文件名进行查询。gql(query_string, *args, **kwds): http://code.google.com/appengine/docs/python/blobstore/blobinfoclass.html#BlobInfo_gql
对于"servlet",您可以只编写请求处理程序,它将输出0或1以响应提交的文件名。
另外,如果您只希望每个用户/组织使用该文件名创建一个文件,您可能希望存储一个单独的上传文件列表和相应的用户/组织,并查询该列表
- 是否有一个JS/jQuery函数可以获取某个类的每个元素的ID
- 我如何制作一个JS函数,它可以从相似的原始颜色双向更改为某个颜色
- 如何将变量传递到另一个js文件
- 我怎么能让流星简单模式中的一个字段等于一个js变量,并且仍然让用户填写简单模式的其余部分
- 如何从onclick函数设置全局变量并将其传递给另一个JS文件
- 从另一个JSAppleScript运行另一个JS AppleScript时出现权限错误
- hapi:包括一个js自定义库
- 我们可以在一个js文件中有多个module.exports语句吗
- Java,nashorn访问另一个js文件
- ajax没有;t成功后调用另一个js函数
- 我上传了客户's服务器一个js函数不起作用
- 另一个.js文件中的函数不起作用
- 如何让一个变量从一个控制器到一个js文件,再到一个渲染的分部
- 如何调用另一个js文件中的函数或触发一个自定义事件,该事件将参数作为Jquery中的数据对象传递
- Nodejs:在节点服务器启动时运行一个js文件
- 我想放一个JS函数,它适用于列表的所有元素,但我可以't将其复制到每个元素中
- 声明一个js变量,该变量将被我的2个jsp访问
- 将一个js变量传递给onkeyup输入文本
- 在另一个.js文件中调用js函数
- MongoDB:如何调用另一个JS文件中定义的函数