使用PHP进行非常大的上传

使用PHP进行非常大的上传,php,upload,large-files,Php,Upload,Large Files,我想允许上传非常大的文件到我们的PHP应用程序中(数百个megs-8Gigs)。然而,这有几个问题 浏览器: HTML上传有糟糕的反馈,我们需要要么进行进度调查(这有点愚蠢),要么根本不显示反馈 Flash uploader在开始上载之前将整个文件放入内存 服务器: PHP迫使我们设置post_max_size,这可能导致容易被利用的DOS攻击。我不希望全局设置此设置 服务器还要求POST变量中包含一些其他变量,例如密钥。我们希望能够立即拒绝请求,而不是在上传整个文件之后 要求: HT

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

浏览器:

  • HTML上传有糟糕的反馈,我们需要要么进行进度调查(这有点愚蠢),要么根本不显示反馈
  • Flash uploader在开始上载之前将整个文件放入内存
服务器:

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

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

    • Java小程序怎么样?在我以前工作过的一家公司,我们就是这样做的。我知道小程序很差劲,尤其是在我们所有选项都可用的今天,但它们确实是解决web开发中遇到的类似桌面的问题的最通用的解决方案。请考虑使用APC检查进度和总文件大小。这里有一个关于它的例子。这可能会有所帮助。

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

      将AJAX大文件上传到WebDAV,并取得进展

      一个简单的库


      然后,您可以让JS将用户重定向到成功页面。在关闭JS客户端->WebDAV之前,可以在PHP prelude中处理密钥和不能处理的内容。您可以为1个目录中的脚本设置post_max_大小。将上载脚本放在那里,只允许该脚本处理较大的大小。该脚本仍有可能受到大型/无用文件的攻击,但它避免全局设置

      将其与APC结合使用,您可能会找到一些好的方法:

      我想了解一下,这允许您上传一个大文件,并且仍然可以对该文件进行访问控制。这可能需要更长的时间来实现,但这可能是我所能想到的最安全的方式。

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

      adobe作为

      我还发现了关于codeproject的本教程:


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

      Python处理程序?

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

      我想

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

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


      可以设置上传文件的最大大小;post_max_大小也是如此

      e、 g:

      
      php\u值上传\u最大\u文件大小10G
      php_值post_最大尺寸10G
      
      我在这方面做得很成功,我推荐它。它是一个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,专门为此设计的协议),您可能无法得到想要的


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

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

      看一看

      一个很好的用于上传的java小程序


      我用它上传图像,效果很好。我没有尝试过使用大于10MB的大文件,但我也应该使用真正大的文件

      我知道它很老了,但也许现在有人也有这个问题。 现在,您只需使用Javascript和(比如)PHP就可以做到这一点。客户端不需要闪存或Java

      演示:


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

      试试这个:在一个聪明的PHP应用程序包装中使用一个基于Java的FTP小程序。

      APC技巧需要轮询,我不喜欢这一点,因为我们的负载平衡方案。您无法轮询,因为每个轮询请求可能被设置为不同于开始下载的服务器?您可以将轮询密钥存储在数据库中Peter D-correct Aiden,这是不可能的,因为我只能请求上载信息(即使使用密钥)在开始上传的服务器上。啊,我明白了。如果您启动了一个内部脚本来轮询正确的服务器,并将这些结果存储在中心位置,并且在前端有一个处理程序,该怎么办?Javascript不允许我读取本地文件的内容。我不知道“webdavsystem”到底是怎么做到的,但我认为他们仍然使用标准上传,并且在服务器上有一个特殊的处理程序。java小程序可能会做到这一点,但这只是问题的一半。Wordpress使用的是基于flash的上传程序。不幸的是,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");