谷歌应用引擎如何报告文件上传的进度

时间:2009-10-04 09:04:14

标签: python google-app-engine progress-bar

我一直在尝试使用谷歌应用引擎的ajax风格的文件上传组件(如dojox文件上传组件),并有一个进度条。

事情的javascript方面很好,但我想知道如何组织服务器端的东西?

是否可以访问谷歌应用引擎中上传的数据,也许可以使用BaseHTTPServer?然后我可以从客户端轮询这个。

即使无法取得进展,至少能够终止大型文件并让用户知道它很大而不会让用户上传1MB(谷歌应用程序引擎限制)会很棒)然后发现它是大的。

有一些类似的问题:Similar stack overflow question 1Similar 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)

3 个答案:

答案 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是字节)。它不关心服务器响应。