大约一千张图片的PHP上传器?

Posted

技术标签:

【中文标题】大约一千张图片的PHP上传器?【英文标题】:PHP uploader for about a thousand images? 【发布时间】:2011-01-05 08:01:22 【问题描述】:

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

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

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

谢谢

编辑:

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

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

假设我采用“所有东西都在一个 zip 中”的路线,PHP 可以工作吗?

再次感谢。

编辑:

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

编辑:

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

【问题讨论】:

【参考方案1】:

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

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

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

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

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

关于进度条支持:

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

回复小绿:

我使用了这个扩展程序http://pecl.php.net/package/uploadprogress(它设法与我已经安装的至少一个扩展程序发生冲突——尽管我认为他们现在已经解决了这个问题)并基于多个网络上的示例,努力融合每个示例中的精华。例如使用不可见的 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 上传输非常大的文件时可能会出现问题,尽管它通常适用于小型(例如

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

【讨论】:

顺便说一句,有一些基于 Flash 的进度条解决方案,例如 www.swfupload.org。它们很棒,但就像 PHP 一样,并不是真正为数千个文件和大量数据构建的。 FTP 或 P2P 绝对是正确的方式。 是的,值得一提。我通常不喜欢在可能的情况下使用基于 Flash 的选项,但在这种情况下提一下是一件好事,因为它们比在 HTML 中使用标准文件上传方法更复杂,我希望处理大文件上传比大多数浏览器更好他们自己会。我之前在 PHP + JS 中创建了非常漂亮的基于 DHTML 的文件卸载程序,但它绝对仅用于专用,因为如果您想要具有跨浏览器支持的复杂 UI(在 HTML5 上滚动!),则需要相当多的黑客技术。跨度> 只是出于好奇..您是如何在那些漂亮的网站上实现进度条的? @littlegreen 在我的回答中包含了回复【参考方案2】:

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

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

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

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

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

【讨论】:

【参考方案3】:

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

如果您担心文件的数量,只需让客户端压缩它们即可。你可以在服务器上解压压缩包,然后把图片放到需要去的地方。

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

【讨论】:

【参考方案4】:

我只需要为客户解决类似的问题。他们经常让他们的客户上传一堆文件给他们,总共 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

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

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

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

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

【讨论】:

+1 获取详细答案,其中包含我懒得查找和粘贴的有用信息 8) 巧合的是,我已经准备好了信息。过去几天我一直在为我正在开发的网站寻找所有这些东西 :)【参考方案5】:

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

我在一次上传会话中使用了多达 1000 张图片。

【讨论】:

以上是关于大约一千张图片的PHP上传器?的主要内容,如果未能解决你的问题,请参考以下文章

php中上传多张图片,如何解决?

怎样让KindEditor上传图片使用绝对路径

上传图片超时

php 上传缩放图片

kindeditor-4.1.10 利用js 怎么上传图片?他们官网下下来的例子上传图片的功能也是错的!谁有完整的例子?

php 之跨域上传图片