非常大的PHP上传

我想允许将非常大的file upload到我们的PHP应用程序(数百个megs – 8个演出)。 然而,这有几个问题。

浏览器:

  • HTML上传有糟糕的反馈,我们需要轮询进展(这有点傻),或者根本没有反馈
  • Flash上​​传器在开始上传之前将整个文件放入内存中

服务器:

  • PHP迫使我们设置post_max_size,这可能导致容易被攻击的DOS攻击。 我不想在全局设置这个设置。
  • 服务器还需要一些其他variables在POSTvariables中,例如密钥。 我们希望能够立即拒绝请求,而不是在整个file upload之后。

要求:

  • HTTP是必须的。
  • 只要在浏览器中工作,我就可以灵活地使用客户端技术。
  • PHP不是必需的,如果有一些其他技术可以在Linux环境下正常工作,那非常酷。

如何Java小程序? 这就是我们以前在一家以前工作过的公司做过的事情。 我知道applets吸收,尤其是在这个时代,我们提供了所有的select,但它们确实是Web开发中遇到的类似桌面问题的最通用的解决scheme。 只是要考虑一下。

upload_max_filesize可以基于每个目录设置; post_max_size也是一样

例如:

<Directory /uploadpath/> php_value upload_max_filesize 10G php_value post_max_size 10G </IfModule> 

Python处理程序?

使用Python POST处理程序而不是PHP。 从您的PHP应用程序生成一个客户端可以放入HTTP标头的唯一标识符。 使用mod_python在整个POST主体传输之前拒绝或接受大的上传。

我想http://www.modpython.org/live/current/doc-html/dir-handlers-hph.html

允许您检查标题并拒绝其余的POSTinput。 我没有尝试过,但可能是正确的道路?

查看mod_python的源码,通过read()缓冲input似乎允许对HTTPinput进行一次一位的评估。 头是第一位的。

https://svn.apache.org/repos/asf/quetzalcoatl/mod_python/trunk/src/filterobject.c

我知道这很老了,但也许现在也有人有这个问题。 现在你可以用Javascript和PHP来做到这一点。 客户端不需要Flash或Java。

演示: http : //dnduploader.filkor.org/

这个想法是用Javascript的Blob slice()方法切片文件…

您可以为1个目录中的脚本设置post_max_size。 将您的上传脚本放在那里,只允许该脚本处理大尺寸。 这个脚本仍然有可能被大/无用的文件攻击,但是它避免了全局的设置。

在APC中使用它,你可能会find一些好的东西: IBM Developer在APC上发表文章

试了这一切…这是迄今为止我用过的最好的…

http://www.uploadify.com/

看看jumploader.com

一个好的java applet上传。

我用它来上传图片,它工作正常。 还没有尝试过大于10MB的文件,但我也应该为大文件工作。

你有没有看过使用APC来检查进度和总文件大小。 这是一个很好的博客文章 。 这可能有帮助。

也许你可以在浏览器中使用Webdav和Javascript

AJAX大file upload,进展到WebDAV

http://www.webdavsystem.com/ajax/programming/upload_progress

一个简单的库

http://debris.demon.nl/projects/davclient.js/doc/README.html

然后,您可以让JS将用户redirect到成功页面。 在交出JS客户端 – > WebDAV之前,秘密密钥和什么不能在PHP序列中处理

我会研究FTP,SSH或SCP,这允许你上传一个大文件,并且仍然可以对文件进行访问控制。 这可能需要一些时间来实现,但可能是我想到的最安全的方式。

我已经成功了uploadify ,我会推荐它。 这是一个处理大量上传的jQuery / Flash脚本,你可以传递额外的参数(比如密钥)。 要解决服务器端问题,只需使用下面的代码。 这些更改只影响它们在其中调用的脚本:

 //Check to see if the key is there if(!isset($_POST['secret_key']) || !isValid($_POST['secret_key'])) { exit("Invalid request"); } function isValid($key) { //Put your validation code here. } //This line changes the timeout. //Give it a value in seconds (3600 = 1 hour) set_time_limit(3600); //Set these amounts to whatever you need. ini_set("post_max_size","8192M"); ini_set("upload_max_filesize","8192M"); //Generally speaking, the memory_limit should be higher //than your post size. So make sure that's right too. ini_set("memory_limit","8200M"); 

编辑回应你的评论:

鉴于你所说的话,恐怕你可能无法通过http满足你的要求。 所有的解决scheme都有一些代码可以为http添加function,这是从来没有devise过的。

就像你自己说的那样,这是一个简单的协议。 除了编写你自己的浏览器外的客户端软件,一个java小程序,或者使用不同的协议(如为此devise的FTP),你可能不会得到你想要的。

在给定的约束条件下,我已经尽了最大的努力。 抱歉,我无法做得更好。

我知道它吸收添加另一个依赖项,但根据我的经验,大多数做这样的事情的网站是在客户端使用Flash,并将大file upload为块

adobe作为flashfile upload的指导

我也在codeproject上find了这个教程:

使用Flash和ASP.NET的进度条多file upload

PS – 我知道你使用的是PHP而不是.net,我认为重要的部分是flash;)

试试这个: http : //www.simple2ftp.com从一个聪明的PHP应用程序包装中使用基于Java的FTP小程序。