4

我正在网站上工作,我需要一个客户向我发送近一千张图片。我们之间有一点地理距离,所以虽然邮寄 CD 或 SD 卡并非不可能,但不是首选。我可以编写一个PHP上传器让客户端提交图片,还是有更好的方法?我不想订阅任何文件共享网站。

假设我正在编写这样的上传器,有没有办法编写 progresbar 和/或其他一些功能,以防止因上传中断而损坏文件?

任何有帮助的资源链接都是加分项。

谢谢

编辑:

这是一次性的事情,这些是我们正在讨论的高质量图像。这将是几个 GB。

FTP 空间是指我的 FTP 服务器的用户名和密码?可以,但是(为什么)FTP 客户端比基于 Web 的上传器更好?我不确定客户端是否知道或想要下载 FTP 程序。客户端在 Mac 上,我不相信我见过的几个 Mac FTP 程序。

假设我采用“一个 zip 中的所有内容”路线,PHP 会工作吗?

再次感谢。

编辑:

好的,到目前为止,我一直被说服不要使用 PHP,除非我们使用 .zip 文件。另外,我现在可能会取消进度条。等待客户,将在接下来的几天内回复大家。

编辑:

在某种活动上遇到了客户。客户将照片保存在闪存驱动器上。问题解决了。+1 所有输入。

4

5 回答 5

6

我会说设置一些 FTP 空间或 WebDAV 共享。如果您不能这样做,那么我会将图像上传到单个(或少量)zip 文件中,而不是尝试处理数百个独特的上传,这将非常耗时,因为浏览器只会选择一个文件在文件上传对话框中一次(即您不能只选择要上传的整个目录)。

为什么不在这种情况下使用 PHP:

在 PHP 中编写一个简单的文件上传处理程序很容易,但如果您确实想要处理非常大的上传,那就有点棘手了,因为您需要警惕文件大小上传限制、脚本执行时间限制和内存限制。第一次设置可能有点令人沮丧。

如果它是您要处理的多 GB 文件,那么 HTTP 上传不是您想要的方式(基于,如果您不得不问为什么,让它按您的意愿工作可能对您来说是一个非常令人沮丧的过程)。

Mac OS 上有几个优秀的 FTP 客户端,没有理由相信 Web 浏览器是比 FTP 客户端更好的文件传输方法。

关于进度条支持:

目前 PHP 中的进度条支持非常有限(目前仅通过有点毛茸茸的 3rd 方模块),尽管我相信有计划将该模块包含在标准发行版中。谷歌搜索 uploadprogress.so 应该会给出一些相关的结果。

回复小绿:

我使用了这个扩展http://pecl.php.net/package/uploadprogress(它设法与我已经安装的至少一个扩展发生冲突 - 尽管我认为他们现在已经解决了这个问题)并编写了一个自定义 javascript 处理程序(http ://iaincollins.com/javascript/FileUploader.js) 基于网络上的一些多个示例,努力将每个示例中的精华融合在一起。例如,使用不可见的 iframe 透明地返回上传进度,创建 DHTML 文件上传对话框并通过使其透明并将其覆盖在我自己的控件之上来替换丑陋的基于浏览器的文件上传控件(所以它仍然是可点击的,因为你无法从 JavaScript 调用文件上传对话框,尽管您可以获得已选择上传的文件的名称)。获得正确的 CSS 样式对此尤其重要——它是特定于浏览器的。

遗憾的是,我写的 JS 是针对特定情况的,但它可能有一些有用的元素 - 抱歉,我没有可以链接到的任何公共内容,因为它是为私有接口创建的。

我看到现在有一​​个用于 uploadprogress 的 jQuery 插件 - 它并不能做所有事情,但这将是一个好的开始: http: //nixbox.com/demos/jquery-uploadprogress.php ...我记得有更好的例子在那里,包括一个处理多个文件上传的文件(通过排队并按顺序执行它们 - 您仍然必须一次选择一个文件)但不幸的是我似乎找不到它们。

结论:

除非您有时间,否则我会尽量避免麻烦并做一些类似 FTP 空间或私人/点对点文件传输应用程序的事情。

文件传输协议(顾名思义)专为大型文件传输而设计,是一个更好的选择,因为它需要很少的配置(您不会遇到资源限制)并且您可以合理地期望客户端具有 FTP 恢复支持,假设您的服务器确实如此(即,如果下载停止,他们应该能够轻松地从中断的地方恢复它,而不是像处理基于 PHP 文件的 HTTP 上传那样从头开始)。

虽然 HTTP 具有处理上传文件的能力,但它不是那么健壮,并且需要显式配置各种资源限制(在 Web 服务器和 PHP 中 - 如上所述)以使上传多 GB 文件成为可能。即使使用 WebDAV(使用 HTTP 服务器远程文件系统),它也是透明的,但它往往不如 FTP 强大,主要是由于客户端实现存在错误 - 特别是在 Windows 和 Mac OS 上传输非常大的文件时可能会出现问题,尽管它通常适用于小型(例如 <500 MB)文件传输。

附带说明一下,HTML5 规范将改进文件上传的处理方式——一次上传多个文件的可能性,并将文件上传进度作为规范的一部分,但目前它并不是一个真正的选择。

于 2010-01-15T00:53:21.307 回答
4

我建议使用 FTP,原因是您可以进行批量上传、启动/暂停/停止并保留文件夹层次结构(如有必要)。Mac 的 FTP 解决方案很棒;我使用传输和 Cyber​​duck。Filezilla 也不错。

另一个 FTP 选项是让您的客户使用他的 Mac 设置本地 FTP 服务器,您可以从中下载照片。这需要一些配置,但绝对是可能的。

在任何情况下,我都不建议为这么多文件使用基于浏览器的文件上传。如果您逐个(甚至分批)上传它们,您可能会给您的客户带来很多麻烦。PHP 的 post 参数和上传文件大小限制将使将所有图像压缩到一个存档中变得困难,并且传输大文件可能会导致超时问题,因为浏览器通常无法处理暂停和恢复。

基于浏览器的上传例外是使用基于 Flash 的文件上传器,例如SWFUpload。有了它,您可以让您的客户端一次性选择所有文件,然后将文件排队并一一上传到您的服务器端脚本(可以是 PHP)。事实上,我使用它的目的与让客户向我发送文件的目的相同。

话虽如此,在这种情况下,我仍然推荐 FTP。

于 2010-01-15T02:31:29.390 回答
2

我只需要为客户解决类似的问题。他们经常让他们的客户上传一堆文件给他们,总共 300-400mb,通常是通过 FTP。但是,一个客户端有防火墙,无法使用 FTP。所以我不得不编写一个 HTTP 上传器。

我在互联网上搜索了一个 PHP 解决方案,发现与 Ian Collins 已经说过的基本相同,1)PHP 是可能的,但是很麻烦,2)对 PHP 的进度条支持很糟糕。不过,我可以为您提供更多详细信息,关于上传/大小限制,您应该没问题,只要您在包含以下代码的 Web 目录中包含一个 .htaccess 文件,这应该为您提供 3GB 的上传限制和无限的脚本执行只要您的虚拟主机支持在 htaccess 文件中设置 PHP conf 值:

php_value upload_max_filesize 3000M
php_value post_max_size 3000M
php_value max_execution_time 0
php_value max_input_time 0

编写上传脚本相对简单。在这里可以找到一个很好的教程。

使用进度条更加棘手。如果不安装扩展,则无法实现仅 PHP 的进度条。一个普遍接受的选项是使用混合 Perl/PHP 解决方案,但它要求您能够在您的服务器上运行 CGI 脚本。我不能,所以我把进度条去掉了。不过,这对客户端非常不友好,因为他盯着不动的屏幕很长一段时间,认为浏览器已锁定,如果他以某种方式关闭它或失去 Internet 连接,他将不得不重新开始。

一次上传多个文件也很棘手。通过使用高级文件选择控件和 AJAX 打开多个并发上传会话,您可能会走得很远,但您会遇到同样的问题:当由于一些奇怪的文件名、磁盘已满或连接丢失而失败时,客户端将必须重新开始,但服务器上已经有一堆文件。编写用户友好的简历解决方案并非易事。我建议您让客户压缩他的文件并批量上传。

由于这是一次性的事情,我建议您不要费心编写自己的解决方案并使用已经可用的工具。为什么不让您的客户端使用 FTP,例如FileZilla 的 MAC 版本?还是投递箱?或者让他将文件上传到最近允许上传和共享最大 100mb 的任何文件的Google Docs怎么样?

于 2010-01-15T10:53:43.057 回答
2

不考虑文件数量,我们在谈论多少数据?

如果您担心文件的数量,只需让客户端压缩它们即可。您可以在服务器上解压缩 zip 并将图像放在需要去的任何地方。

另外,问问自己这是一个会定期发生的过程,还是一个不定期的维护或一次性启动任务?如果是这样,您只需通过 ftp 或其他方法交换文件,即可节省您自己和客户的时间和金钱。

于 2010-01-15T00:41:03.943 回答
0

您可能会考虑 SWFUpload (http://code.google.com/p/swfupload/),它是一个 Flash 和 Javascript 库,可以让上传变得更加容易。它具有开箱即用的 PHP 和 .Net 支持,因此很可能会很好地满足您的需求。

在一次上传会话中,我已将其用于多达 1,000 张图像。

于 2011-01-19T17:00:49.330 回答