PHP上传大约一千张图片?

时间:2010-01-15 00:37:02

标签: php file-sharing multifile-uploader uploader

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

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

任何有用资源的链接都是优惠。

由于

编辑:

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

通过FTP Space,你的意思是我的FTP服务器的用户名和密码?它可以完成,但(为什么)FTP客户端比基于Web的上传器更好?我不确定客户端是否知道如何下载FTP程序。客户端在Mac上,我不相信我见过的几个Mac的FTP程序。

假设我采用“一条拉链中的所有东西”路线,PHP会起作用吗?

再次感谢。

编辑:

好的,到目前为止,我已经确信不使用PHP,除非我们使用.zip文件。另外,我现在可能会修改进度条。 等待客户,将在未来几天内回复所有人。

编辑:

在某种功能上遇到客户端。客户端将照片放在闪存驱动器上。问题解决了。 所有输入都是+1。

5 个答案:

答案 0 :(得分:6)

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

为什么不在这个例子中使用PHP:

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

如果它是你要处理的多GB文件,那么HTTP上传就不是你想要的方式了(基于,如果你不得不问为什么,让它按你想要的那样工作可能会非常令人沮丧你的过程)。

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

关于进度条支持:

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

回复littlegreen:

我使用了这个扩展程序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上传有关)。 / p>

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

作为旁注,HTML5规范将改进文件上传的处理方式 - 可以一次上传多个文件,并将文件上传进度作为规范的一部分,但是现在它不是一个真正的选项。 / p>

答案 1 :(得分:4)

我建议使用FTP,原因是你可以进行批量上传,开始/暂停/停止并保留文件夹层次结构(如有必要)。适用于Mac的FTP解决方案非常棒;我使用Transmission和Cyber​​duck。 Filezilla也很好。

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

在任何情况下,我都不建议为此数量的文件上传基于浏览器的文件。如果您逐个上传(或者甚至批量上传),您可能会为您的客户创建一大堆麻烦。 PHP的帖子参数和上传文件大小限制将使所有图像压缩到一个存档很困难,并且传输大文件会导致超时问题,因为浏览器通常无法处理暂停和恢复。

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

话虽如此,我仍然建议在这种情况下使用FTP。

答案 2 :(得分:2)

忽略文件数量,我们谈论了多少数据?

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

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

答案 3 :(得分:2)

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

我在互联网上搜索了一个PHP解决方案,发现基本上与Ian Collins已经说过的相同,1)PHP是可能的,但毛茸茸的2)PHP的进度条支持很糟糕。我可以给你一些更详细的信息,关于上传/大小限制你应该没问题,只要你在你的web目录中包含一个.htaccess文件包含以下代码,这应该给你3GB的上传限制和无限的脚本执行只要您的webhost支持在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

编写上传器脚本相对简单。找到了一个很好的教程here

使用进度条比较棘手。如果没有安装扩展,则无法使用仅限PHP的进度条。一个普遍接受的选项是使用hybrid Perl/PHP solution,但是要求您能够在服务器上运行CGI脚本。我不能,所以我离开了进度条。这对客户来说是非常不友好的,因为他盯着一个不动的屏幕很长一段时间,以为浏览器已经锁定,如果他以某种方式关闭它或丢失了他的互联网连接,他将不得不重新开始。 / p>

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

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

答案 4 :(得分:0)

您可以考虑使用SWFUpload(http://code.google.com/p/swfupload/),这是一个Flash和Javascript库,可以让您轻松上传。它具有开箱即用的PHP和.Net支持,因此它可能很适合您的需求。

我在一次上传会话中使用它可以拍摄多达1,000张图片。