简单的AJAX / jQuery应用程序,可在复制期间实时显示文件

时间:2017-06-04 16:21:09

标签: jquery python ajax

在研究Ajax / jQuery时,我正在尝试设置此测试环境:

  1. 服务器以递归方式将一个完整文件夹从一个位置复制到 另一个;
  2. 客户端应显示复制文件列表,一个 一个,实时直到副本结束;
  3. 在客户端中,thereshould是一个中止复制操作的按钮。
  4. 你能指点我这个问题的简单骨架,还是给我任何线索? 谢谢,我很感激。

1 个答案:

答案 0 :(得分:1)

客户的一些一般想法:

  • 需要建立一个会话。这样既可以看到它正在复制的文件的文件复制进度,也没有其他(可能是恶意的)第三方可以看到它。这可以通过某种令牌来完成。这可以存储为cookie,服务器可以读取它以查看请求来自哪个会话。
  • 您需要客户端以稳定的间隔继续请求状态。这称为polling

因此,您的客户端所要做的就是请求建立一个会话,请求需要复制哪个文件夹(可能需要请求目录树),然后请求将哪个文件夹复制到哪里,以及每隔几秒或几分钟继续请求进度,直到完成为止。同时,如果用户希望取消它,请向某个端点发送取消请求。

在服务器端,有许多技术可以做到这一点。 django是最受欢迎的,但这似乎是一个较小的项目,所以我可能会推荐flask

至于实际任务,shutil.copytree()正是您所寻找的。它需要一个自定义复制功能,您可以指定它来更新会话"当前复制"需要复制新文件时的文件:

import shutil

def copy_dir(session_id, source, destination):
    def copy_fn(src, dest):
        if sessions[session_id]['data'].aborted:
            return  # Stop copying once requested.
        # Or however your session data is structured
        sessions[session_id]['data'].current_copy = [src, dest]
        shutil.copy2(src, dest)  # Actual copy work
    shutil.copytree(source, destination, copy_function=copy_fn)

要获取已复制文件的百分比,请将正在复制的文件的大小与正在复制的文件进行比较。

另一种获取复制百分比的方法,os.walk在目录上生成所有文件名,然后打开文件并将其复制到块中。每隔几个块更新进度。请注意,这非常容易出错。