【问题标题】:How can google app engine report progress back on file upload谷歌应用引擎如何报告文件上传进度
【发布时间】:2018-01-17 18:19:37
【问题描述】:

我一直在尝试将 ajax 样式的文件上传组件(如 dojox 文件上传组件)与 google 应用引擎一起使用,并且有一个进度条。

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

在谷歌应用程序引擎中上传数据时是否可以访问数据,也许是 BaseHTTPServer ?然后我可以从客户那里轮询这个。

即使无法进行进度,至少能够终止一个大文件并让用户知道它太大而不让用户上传 1MB(谷歌应用引擎限制) 然后发现它太大了。

还有一些类似的问题:Similar stack overflow question 1Similar stack overflow question 2

以下 google app engine python 代码只是简单文件上传的基本 post 处理程序(工作正常),但我正在寻找一些在较低级别运行的东西。当 post 处理程序获取它时,文件已全部上传。

在 LAMP 堆栈上,您可以轮询监视临时文件大小增长的服务器端脚本。当文件从临时文件夹中移动时,您就知道它已完成。通过使用这种方法,您可以在不使用 flash 的情况下查看多个文件的进度,我不确定如何使用 google app engine 做同样的事情。

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)

【问题讨论】:

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


    【解决方案1】:

    在请求完成之前,App Engine 不会从请求处理程序返回任何数据,因此任何进度检查都必须在客户端完成。 IIRC 在上传完成之前,您的请求甚至不会被加载到应用程序服务器中。

    【讨论】:

    • 谢谢,好吧 - 我猜是应用引擎的限制之一。
    • 不,如果没有客户端帮助应用程序,任何基于 HTTP 的上传都无法报告进度。
    • 在答案中澄清这不是 App Engine 独有的——这正是 HTTP 的工作方式。
    【解决方案2】:

    您可以使用swfupload 限制客户端站点上的文件大小。

    它是一个带有 javascript api 的 flash 组件,它公开了 flash 上传功能。 文件大小的检查在客户端浏览器中完成。 (在函数CheckFileSize

    该库还有其他好东西,例如进度条,请查看其主页以获取完整功能列表。

    【讨论】:

    【解决方案3】:

    这不适用于所有浏览器,但它是通过 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”参数是一个函数,它接受一个对象,该对象具有(至少)一个“加载”和一个“总”字段(单位是字节)。它不关心服务器响应。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-12-01
      • 1970-01-01
      • 2012-07-27
      • 2013-05-19
      • 1970-01-01
      • 2023-03-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多