上传文件的不同方式?

7

我读过几种上传文件到服务器的方法。

还有其他选择吗? 我正在开发的项目需要此功能,我要上传的文件可能会很大,高达数千兆字节。 我想对不同方法进行彻底评估。

ADD 1

感谢您的回复。 这些天我忙于处理其他事情,直到看到SO通知之前都无法回答该问题。 我很抱歉在赏金即将到期时才添加细节。

在我的情况下,有1个Web服务器,一个文件服务器和许多代理。 整个图像看起来像这样:

enter image description here

  • 用户通过浏览器与Web服务器交互以进行日常操作。
  • 用户通过浏览器将文件上传到文件服务器。 (我希望一切都在浏览器中发生,以使客户的生活更轻松。)
  • 代理是与Web服务器和文件服务器通信的桌面应用程序。
  • 代理从web服务器获取常规信息。
  • 代理从文件服务器拉取文件并将文件推送到文件服务器。 并通知Web服务器有关所有内容。
  • Web服务器从文件服务器上拉取文件以在浏览器中呈现给客户。

一些编码上下文:

  • Java
  • Spring
  • Netty

1
你能使用FTP或SCP吗? - Timothy Jeffcoat
3
你是否正在使用内容管理系统,例如WordPress或MediaWiki?您的服务器支持某种服务器端编程语言吗?您的项目是否允许使用第三方存储解决方案,如Dropbox或Google Drive?答案可能因项目和服务器的具体情况而异。目前来看,这个问题似乎非常广泛。有点太宽泛了。 - Ayelis
你想用哪种编程语言来实现这个?操作系统是什么?还有其他的环境特征吗?请提供更多细节以提高获得成功响应的机会。 - CaptainBli
5个回答

11

上传文件到服务器的其他方式(总结):

最后,下面的链接展示了经典 ASP 的 HTTP 上传实现方法:https://support.microsoft.com/en-us/kb/299692

这是一些技术或方法的概要,但有很多其他解决方案。


1
太好了 :) 我认为smwikipedia很可能会选择其中之一 :P - Ujjwal
1
ASP方法只是经典ASP实现HTTP上传的示例。因此,我会将其从列表中删除。 - Andrew Simontsev
然后我将从列表中删除它,并将其添加为Classic ASP的HTTP上传实现示例。 - juanmajmjr

5
您没有明确说明您的平台/语言目标。 我担心它不是一个网络应用程序,因为您提到的两个选项最广泛地应用于网络应用程序。
好的,上传大文件需要设计得非常仔细。在上传过程中,您的连接可能会中断,某些数据包可能会损坏,甚至上传终端系统可能会出现故障。
如果是我,安全可靠的文件上传最好采用将文件分成较小的块,并应用多线程程序来处理这些块的上传。在接收端,需要类似的功能来重新组装。此方法的优点是:
1.能够跟踪进度。 2.可以实现恢复能力。 3.通过校验和进行验证,可以确保免于损坏。
但是,对于精确的解决方案,请扩展您的描述。如果您必须放入赏金,那么描述中肯定缺少某些内容。

4
我同意@Ayelis的评论(主贴)认为这个问题太抽象了。不过我想补充一下。
实际上,你有两个选择:
1. 你希望将上传过程与网站集成,并且用户不仅仅是向你发送一个文件,而且还要创建一个订单/案例/记录(即此文件应与某个数据库条目和用户相关联)。 2. 即使没有网站,你也需要让用户能够向你的公司传输文件。
在第一种情况下,唯一的选择是使用基于HTTP的解决方案。在第二种情况下,你可以尝试使用FTP、云存储系统(Dropbox等),等等。当然,在第一种情况下也可以使用FTP,但只有在用户数量有限的情况下才可行(例如,只有员工)。
所以我假设你正在研究将上传集成到网站中的第一种情况。
你提到的重要限制是要上传几个GB的文件。如果你只是在页面上添加一个<input type="file">元素,你可能会遇到很多问题(客户端内存、服务器端内存、安全性、可靠性等——这将取决于技术选择)。为了解决这些问题,最好的方法是创建一个JavaScript上传程序,将文件分割成较小的部分(例如5MB)并将它们作为单独的文件上传。在服务器上,你可以将所有这些文件组合在一起,并将其重新组装为完整的文件。结果是:
1. 不需要准备和接收非常大的POST请求(可能会占用大量内存)——从技术角度来看,这将等同于上传数百个常规小文件。 2. 它不是一个问题,使它可靠(如果上传2GB的文件在90%时中断,用户不必从头重新上传)。 3. 不需要关闭服务器上的POST请求验证规则。
这需要在客户端和服务器端编写大量代码。但是,如果你的团队中有全栈开发人员,这不是问题。此外,你可以搜索第三方解决方案来解决此问题。
如果你不想使用HTTP(例如,第二种情况更适合你),并且认为Dropbox/Google Drive等是一种诱人的方法,请注意对于非常大的文件,它可能是一个糟糕的解决方案(由于带宽和成本)。我建议看看像Seafile或ownCloud这样的解决方案,至少它们是免费的。
希望这有所帮助。

4

[回复是因为我觉得这在哲学层面上很有趣!]

这是一个公平的问题,考虑到“...几个千兆位”。我认为无论你试图实现什么语言,架构和系统要求都非常重要(与@Ayelis一致)。我将解决方案分为以下类别:

  1. 传统的客户端-服务器上传 - 我认为这不起作用,因为用户必须保持选项卡/浏览器打开直到上传完成

  2. 中间阶段/人:基于中间阶段解耦上传和存储/下载的解决方案(例如:Dropbox,Google驱动器等...)。在这种情况下,你的 Web 应用接受一个 URL 来“获取文件”。问题是:你的服务器可以从某个位置“拉取”吗?你的客户端是否需要在某个公开/可访问的地方上传文件?如何显示传输的进度?

  3. 内网解决方案,用于同步/挂载文件系统 (rsync,内部 git 存储库,共享 cifs/nfs 挂载驱动器)

  4. 更多的 P2P 方面……本地客户端(除 web 外的任何内容),具有上传、暂停和恢复到给定远程位置的能力。在这个类别中,我还放置了众所周知的 P2P/torrent 应用程序。可能的情况是:客户端上传一个(合法的)torrent,将磁力链接或其他注册到 Web 服务器上,该服务器正在排队下载(有点像ktorrent web接口曾经工作...不确定现在是否仍然如此)。

再次像@Ayelis所说的那样,更多的信息将帮助您获得更好的答案......我只是发现这是一个具有挑战性的问题!


4
如果你需要一个严格基于浏览器的大文件解决方案,你将不得不依赖 JavaScript(我可以说 Java Applets 或 -- 呼吸困难 -- Flash,但我不推荐它,实际上它是桌面应用程序的伪装 -- 但它们是一个选项)。
话虽如此,对于大文件,使用 File API 的选择非常有限。有出色的解决方案,但我喜欢 Blueimp 的 jQuery 文件上传。

https://github.com/blueimp/jQuery-File-Upload

您应该查看他们的分块文件上传以进行可恢复上传:

https://github.com/blueimp/jQuery-File-Upload/wiki/Chunked-file-uploads

这应该允许您处理非常大的文件,即使在不稳定的连接下也能实现。

-- 如果您没有仅限于浏览器的限制,则有许多选项可以在答案中讨论。

更新 您拥有为浏览器和桌面应用程序提供服务的Web服务器。为了避免为每个应用程序编写服务器代码,请针对最严格(沙箱化,对本地设备的访问受限)的浏览器场景编写代码。桌面应用程序应该很容易适应浏览器强加的任何情况。

如果您能够为浏览器编写解决方案,则代理应用程序应该很容易实现。

更新2

您的图表在浏览器和文件服务器之间有一条线。这并不完全正确。浏览器将仅连接到Web服务器,并将其存储在您拥有的任何后端上(自己的服务器,数据库,其他文件服务器等)。

代理连接到文件服务器可能可能会起作用,但那样您可能会通过网络协议进行工作,例如(编写一个桌面应用程序,它将通过常规共享网络驱动器操作文件)。

但是,如果您希望代理与浏览器一样移动,则应将其视为用于文件上传和服务器通信的浏览器(因此代理和文件服务器之间没有线条)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接