37

我想允许将非常大的文件上传到我们的 PHP 应用程序中(数百兆 - 8 演出)。然而,这有几个问题。

浏览器:

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

服务器:

  • PHP 强制我们设置 post_max_size,这可能导致容易被利用的 DOS 攻击。我不想全局设置此设置。
  • 服务器还需要一些其他变量存在于 POST 变量中,例如密钥。我们希望能够立即拒绝该请求,而不是在整个文件上传之后。

要求:

  • HTTP 是必须的。
  • 我对客户端技术很灵活,只要它在浏览器中工作。
  • PHP 不是必需的,如果有一些其他技术可以在 linux 环境中很好地工作,那就太酷了。
4

13 回答 13

14

upload_max_filesize 可以在每个目录的基础上设置;post_max_size 也是如此

例如:

<Directory /uploadpath/>
  php_value upload_max_filesize 10G
  php_value post_max_size 10G
</IfModule>
于 2009-05-14T18:44:36.980 回答
7

Python处理程序?

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

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

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

查看 mod_python 的源代码,通过 read() 缓冲输入似乎允许对 HTTP 输入进行逐位评估。标题是第一位的。

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

于 2009-05-14T18:17:13.380 回答
7

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

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

这个想法是使用 Javascript 的 Blob slice() 方法对文件进行切片...

于 2012-05-08T21:37:02.243 回答
3

Java小程序怎么样?这就是我们在我以前工作过的公司中必须这样做的方式。我知道小程序很糟糕,尤其是在这个时代,我们有所有可用的选项,但它们确实是解决 Web 开发中遇到的桌面类问题的最通用的解决方案。只是需要考虑的事情。

于 2009-05-14T17:13:59.243 回答
2

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

将它与 APC 一起使用,您可能会得到一些好的结果: IBM Developer works article on APC

于 2009-05-14T17:26:19.587 回答
2

尝试了所有这些......这是迄今为止我用过的最好的......

http://www.uploadify.com/

于 2009-06-02T03:43:44.393 回答
2

看看jumploader.com

一个很好的上传java小程序。

我用它来上传图片,效果很好。没有尝试过大于 10MB 的文件,但我也应该处理非常大的文件。

于 2009-07-22T23:25:44.583 回答
1

您是否考虑过使用 APC 检查进度和总文件大小。这是一篇关于它的好博客文章。它可能会有所帮助。

于 2009-05-14T17:19:06.530 回答
1

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

AJAX 大文件上传,有进度,到 WebDAV

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

一个简单的图书馆

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

然后,您可以让 JS 将用户重定向到成功页面。在移交 JS 客户端->WebDAV 之前,可以在 PHP 前奏中处理密钥和不可处理的东西

于 2009-05-14T17:19:54.407 回答
1

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

于 2009-05-14T17:31:33.317 回答
0

我知道添加另一个依赖项很糟糕,但根据我的经验,大多数做这样的事情的网站都在客户端使用闪存,并将大文件作为块上传

adobe 作为flash 文件上传的指南

我还在 codeproject 上找到了本教程:

使用 Flash 和 ASP.NET 使用进度条上传多个文件

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

于 2009-05-14T17:38:15.517 回答
0

我已经成功使用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满足您的要求。现有的所有解决方案都包含向 http 添加功能的代码,而这些功能从未为它设计过。

就像你自己说的,这是一个简单的协议。除了编写您自己的在浏览器之外运行的客户端软件、Java 小程序或使用不同的协议(如为此设计的 FTP)之外,您可能无法得到您想要的。

在给定的限制范围内,我已尽我所能。对不起,我不能做得更好。

于 2009-05-14T23:11:17.043 回答
-1

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

于 2013-06-26T19:21:35.463 回答