php - 使用带轮询的 PHP 进行网络间文件传输

标签 php jquery file-io network-programming

我正在设计一个基于 Web 的文件管理系统,可以概念化为 3 个不同的服务器:

  1. 托管系统界面(用 PHP 构建)的服务器,用户可以在其中“上传”和管理文件(此处没有存储实际文件,都是元数据)。
  2. 一个单独的暂存服务器,用于放置要处理的文件。
  3. 一个文件存储区,当文件未被处理时存储在其中。

所有 3 台服务器都将基于同一内部网络的 *nix。基于 Windows 的用户将使用 Web 界面为服务器 1 上的文件创建初始条目。该文件将从用户的本地驱动器“上传”到服务器 3(如果该文件当前不存在于服务器 3 上的任何位置)网络)或内部网络上的另一个网络驱动器。

我的问题与实现我想做的事情的最佳编程方法有关,即:

当用户从网络上传文件(通过网络表单选择源)时,文件作为网络间传输传输到服务器 3,而不是通过用户(我相信如果它作为标准 HTTP 表单上传发送会发生什么)。我知道我可以在每台机器上设置 FTP 服务器并尝试在不同位置之间传输 FXP 文件,但这比在服务器 1(将具有全局网络访问权限)上执行命令的 PHP 更可取,以这种方式执行跨网络传输吗?

第二个问题是,我们正在讨论的这些文件非常大,每个文件至少有 1 GB 或 2 GB,因此传输不会是即时的。我需要一些轮询传输状态的方法,并将其返回到 Web 界面,以便用户知道发生了什么。

或者,可以让此上传与用户的当前 View 异步运行,但我仍然需要一种方法来检查传输状态以确保它完成。

那么,如果使用 FXP 解决方案,如何实现轮询?如果从 shell 使用文件移动/复制命令,是否可以进行任何形式的轮询? PHP/JQuery 解决方案将是非常可接受的。

这个问题的最后一部分与 Windows 网络驱动器映射有关。用户可以映射一个驱动器(并从中选择一个文件),一个任意指定的映射驱动器。他们的 G:\可能与\server4\some\location\therein 有关,但大概通过 Web 表单提供给服务器的任何驱动器路径只会发送 G:\文件路径。 有没有办法确定映射网络驱动器的“真实路径”?

在处理文件时,任何解决方案都可用于将文件从服务器 3 暂存到服务器 2 - 重点是这些巨型文件不必先通过用户的本地计算机。

如果您有任何意见,请告诉我,如果不清楚,我会尽量使这个问题更加连贯。

最佳答案

据我所知(我可能是错的),没有标准的方法可以从浏览器确定映射驱动器的 UNC 路径。

做到这一点的唯一方法是在网页中进行某种控制。可能是 ActiveX 或闪存。我见过 ActiveX 这样做,但没有看到 flash。

过去,在设计需要知道用户映射驱动器的 UNC 路径的基于 Web 的系统时,我必须将驱动器转换为存储在服务器端的 UNC 路径。尽管知道哪个驱动器将映射到哪个 UNC 路径,但我确实很幸运。如果用户可以设置任意路径,那么这显然行不通。

好吧,因为我在拖延和逃避真正的工作,所以我考虑了一下。

首先我要说我绝不是 Linux 专家,我将要描述的系统只是在我脑海中浮现出来的,不是你想要的东西进入任何一种生产。但是,它可能会帮助您走上正确的道路。

因此,您有 3 台服务器,接口(interface)服务器(我假设是 LAMP 堆栈?)、登台服务器和文件存储服务器。您还将拥有客户端计算机和网络共享。出于此设计的目的,您的网络共享托管在您的文件存储可以从中获取 scp 的 nix 框上。

您将创建您的前端网站来跟踪和存储有关文件等的信息。这还将保存有关正在复制哪些文件、哪些文件在暂存中等的详细信息。

您还需要在文件存储服务器上运行某种服务。我将其称为文件复制服务。这将负责处理托管网络共享的服务器中的文件。

现在,您仍然无法确定用户文件实际所在的路径。如果您可以阻止用户映射他们自己的驱动器并强制他们使用一致的驱动器号,那么您可以将驱动器号转换为服务器上的 UNC 路径。如果你不能,那么我会让你弄清楚的。如果您在 Windows 域中,您可以使用组策略强制驱动器映射。

无论如何,系统的流程会像这样工作。

  1. 用户进入系统并选择一个文件
  2. 接口(interface)服务器获取文件路径并调用文件存储服务器上的文件复制服务
  3. 文件复制服务连接到托管文件的服务器并启动复制。如果它们都是 nix 框,您可以轻松使用 SCP 之类的东西。现在,我还没有真正查过如何去做,但如果你不能在 SCP 复制时获得完整百分比的运行总和,我会感到非常惊讶。有了这个运行总数,文件复制服务将使用副本的执行方式更新接口(interface)服务器上的数据库,以便用户可以从接口(interface)服务器看到这一点。

文件复制服务还可用于将文件从文件存储移动到登台服务器。

正如我所说的,经过深思熟虑。以上方法可行,但这在很大程度上取决于您的系统设置方式等。

话虽如此,但肯定有软件可以做到这一点。你看过了吗?

关于php - 使用带轮询的 PHP 进行网络间文件传输,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14236575/

相关文章:

php - MySQL根据两个时间戳列获取结果集

jquery - AJAX 从另一个域 (Dropbox) 获取

javascript - 如何通过javascript获取html范围输入类型的最大值?

c++ - 使用 Remove 删除文件 - C++

java - 使用 Java 将字体写入磁盘(.ttf 文件)

javascript - 什么可以解释浏览器间歇性地不加载某些 CORS(crossorigin)javascript 文件?

php - Yii2如何向外部url发送表单请求

php - 如何获取表中的所有唯一名称并回显它们?

javascript - 一页缩略图中的多个 fancybox 画廊

Android Things 文件系统