我一直在尝试使用谷歌应用引擎的ajax风格的文件上传组件(如dojox文件上传组件),并有一个进度条。
事情的javascript方面很好,但我想知道如何组织服务器端的东西?
是否可以访问谷歌应用引擎中上传的数据,也许可以使用BaseHTTPServer?然后我可以从客户端轮询这个。
即使无法取得进展,至少能够终止大型文件并让用户知道它很大而不会让用户上传1MB(谷歌应用程序引擎限制)会很棒)然后发现它是大的。
有一些类似的问题:Similar stack overflow question 1,Similar stack overflow question 2。
以下谷歌应用程序引擎python代码只是简单文件上传的基本邮件处理程序(工作正常)但我正在寻找一些较低级别的操作。当邮件处理程序获得它时,文件已全部上传。
在LAMP堆栈上,您可以轮询监视临时文件大小增长的服务器端脚本。从临时文件夹移动文件时,您知道它已完成。通过使用此方法,您可以在不使用闪存的情况下查看多个文件的进度,我不确定如何使用Google应用引擎执行相同的操作。
class fileupload(webapp.RequestHandler):
"""
"""
def post(self):
if "image" in self.request.arguments():
content = "<html><body>Error</body></html>"
form = self.request.params['image']
logging.info(form)
try:
filename = form.filename
siz = len(form.value)
###--- Show data
logging.info("Filename: %s" % form.filename)
logging.info("Size: %s" % siz)
content = "<html><body>File has been uploaded Name: %s Size: %s</body></html>" % (filename, siz)
logging.info("DONE")
except:
logging.info("Error: bad form or something like that")
logging.info("writing out response")
self.response.out.write(content)
答案 0 :(得分:1)
您可以使用swfupload限制客户端网站上的文件大小。
这是一个带有javascript api的flash组件,可以公开Flash上传功能。 检查文件大小是在客户端浏览器中完成的。 (在函数CheckFileSize)
图书馆还有其他好东西,比如进度条,请查看完整功能列表的主页。
答案 1 :(得分:1)
在请求完成之后,App Engine不会从请求处理程序返回任何数据,因此任何进度检查都必须在客户端完成。在上传完成之前,您的请求甚至不会被加载到应用程序服务器中。
答案 2 :(得分:1)
这对每个浏览器都不起作用,但这是通过AJAX进行多个文件上传的好方法:
function upload_files(entityKey, files, url, progress_callback) {
var xhr = new XMLHttpRequest(), formData = new FormData();
xhr.upload['onprogress'] = progress_callback;
formData.append('entityKey', entityKey);
$.each(files, function(i, file) { formData.append('file[]', file);});
xhr.open("post", url, true);
xhr.setRequestHeader("Cache-Control", "no-cache");
xhr.send(formData);
}
entityKey是服务器上参数的示例。 'files'参数来自文件类型输入表单元素的'files'属性(作为支持多个的数组)。 'progress_callback'参数是一个函数,它接受一个具有(至少)'loaded'和'total'字段的对象(unit是字节)。它不关心服务器响应。