如何让Google App Engine在文件上传时报告进度?

0 投票
3 回答
1525 浏览
提问于 2025-04-15 14:47

我一直在尝试使用一种类似于ajax的文件上传组件(比如dojox文件上传组件)来与谷歌应用引擎配合使用,并且希望能有一个进度条。

前端的JavaScript部分没问题,但我在想,服务器端该怎么组织呢?

在谷歌应用引擎中,能否在文件上传的过程中访问数据?也许可以用BaseHTTPServer?这样我就可以从客户端去获取这些信息。

即使不能实现进度显示,至少能够在用户上传大文件时及时终止,并告知用户文件太大,而不是让用户先上传1MB(谷歌应用引擎的限制),然后再发现文件超出限制,这样也会更好。

这里有一些类似的问题:类似的Stack Overflow问题1类似的Stack Overflow问题2

下面的谷歌应用引擎Python代码只是一个简单文件上传的基本处理程序(运行得很好),但我在寻找一些更底层的操作方式。因为在处理程序接收到文件时,文件已经全部上传完了。

在LAMP架构中,你可以轮询一个服务器端脚本,监控一个临时文件的大小变化。当文件从临时文件夹移动时,你就知道上传完成了。通过这种方法,你可以看到多个文件的上传进度,而不需要使用Flash。我不太确定在谷歌应用引擎中怎么实现同样的功能。

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 个回答

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'(单位是字节)。这个函数并不关心服务器的响应。

1

你可以在客户端限制文件大小,使用的是 swfupload 这个工具。

它是一个闪存组件,配合 JavaScript 使用,可以让你在网页上上传文件。文件大小的检查是在用户的浏览器中进行的。(具体在 CheckFileSize 这个函数里)

这个库还有其他好用的功能,比如进度条,想了解更多功能可以去它的主页看看。

1

App Engine 在请求处理完成之前不会返回任何数据,所以你只能在客户端检查进度。记得没错的话,你的请求在上传完成之前甚至不会被加载到应用服务器上。

撰写回答