3

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

  1. 托管系统界面(内置 PHP)的服务器,用户在其中“上传”和管理文件(这里没有存储实际文件,都是元数据)。
  2. 一个单独的登台服务器,用于放置文件以进行处理。
  3. 文件不被处理时存储文件的文件存储。

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

我的问题与实现我想做的最佳程序化方法有关,即:

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

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

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

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

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

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

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

4

2 回答 2

0

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

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

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

好的,因为我拖延并避免真正的工作,我已经考虑了这一点。

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

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

您将创建跟踪和存储有关文件等信息的前端网站。这还将包含有关正在复制哪些文件、哪些文件处于暂存状态等的详细信息。

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

现在,您仍然对如何确定用户文件的实际路径有疑问。如果您可以阻止用户映射他们自己的驱动器并强制他们使用一致的驱动器号,那么您可以在服务器上保留驱动器号到 UNC 路径的转换。如果你不能,那么我会让你想办法。如果您在 Windows 域中,则可以使用组策略强制驱动器映射。

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

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

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

正如我所说,非常粗略地考虑了。以上方法可行,但这在很大程度上取决于您的系统设置等。

尽管如此,必须有软件可以做到这一点。你看过吗?

于 2013-01-11T16:05:44.603 回答
0

如果我是正确的,那么这个架构:

在此处输入图像描述

放大图片

1.)

首先让我们解决“服务器间传输”的问题,我将通过NFS将文件系统从服务器 2 和 3 安装到服务器 1 来解决这个问题。

https://help.ubuntu.com/8.04/serverguide/network-file-system.html

所以PHP可以直接将文件存储在文件系统上,而不需要知道文件到底在哪个服务器上。

/etc/exports
of Server 2 + 3
/directory/with/files 192.168.IPofServer.1 (rw,sync)

exportfs -ra


/etc/fstab 
of Server 1
192.168.IPofServer.2:/var/lib/data/server2/ /directory/with/files  nfs rsize=8192,wsize=8192,timeo=14,intr
192.168.IPofServer.3:/var/lib/data/server3/ /directory/with/files  nfs rsize=8192,wsize=8192,timeo=14,intr

mount -a

2.)

获取真正大文件的上传进度,这里有一些可能为 http 上传提供进度条。但是对于恢复功能,您必须使用 Flash 插件。

http://fineuploader.com/#demo

https://github.com/valums/file-uploader

或者您可以使用 apc 扩展由您自己构建它

http://www.amwsites.com/blog/2011/01/use-a-combination-of-jquery-php-apc-uploadprogress-to-show-progress-bar-during-an-upload/

3.)

让服务器从网络驱动器加载文件。这我会尝试使用 java 小程序来计算出真实的网络路径并将其发送到服务器,以便服务器可以在后台获取文件。但我以前从未有过这样的想法,也没有进一步的信息。

于 2013-01-16T15:19:43.700 回答