代码之家  ›  专栏  ›  技术社区  ›  Evert

使用php进行非常大的上载

  •  37
  • Evert  · 技术社区  · 17 年前

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

    浏览器:

    • HTML上传有糟糕的反馈,我们需要对进度进行投票(有点愚蠢)或者根本不显示反馈。
    • 闪存上载程序在开始上载之前将整个文件放入内存

    服务器:

    • php迫使我们设置post-max-u大小,这可能导致一个易于利用的dos攻击。我不想全局设置此设置。
    • 服务器还需要在post vars中存在一些其他变量,例如一个密钥。我们希望能够立即拒绝请求,而不是在整个文件上传之后。

    要求:

    • HTTP是必须的。
    • 我对客户端技术很灵活,只要它在浏览器中工作。
    • PHP不是一项要求,如果有其他技术可以在Linux环境中很好地工作,那就太酷了。
    13 回复  |  直到 17 年前
        1
  •  3
  •   Marc W    17 年前

    一个Java小程序怎么样?我以前在一家公司工作过,所以我们必须这样做。我知道小程序很差劲,尤其是在当今这个时代,有了我们所有的选择,但它们确实是Web开发中遇到的桌面类问题的最通用的解决方案。只是一些需要考虑的问题。

        2
  •  14
  •   Frank Farmer    17 年前

    可以设置上载文件大小 on a per-directory basis ;后最大尺寸也一样

    例如。:

    <Directory /uploadpath/>
      php_value upload_max_filesize 10G
      php_value post_max_size 10G
    </IfModule>
    
        3
  •  7
  •   Aiden Bell    17 年前

    Python处理程序?

    使用python post处理程序而不是php。从您的PHP应用程序生成一个唯一的标识符,客户机可以将其放入HTTP头中。用mod_python来拒绝或接受大的上传,然后整个帖子体被发送。

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

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

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

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

        4
  •  7
  •   Filkor    14 年前

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

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

    想法是用javascript的blob slice()方法对文件进行切片…

        5
  •  2
  •   acrosman    17 年前

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

    把它和APC一起使用,你可能会得到一些好的结果: IBM Developer works article on APC

        6
  •  2
  •   Kladskull    17 年前

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

    http://www.uploadify.com/

        7
  •  2
  •   Johan    16 年前

    看一看 jumploader.com

    一个很好的Java小程序,用于上传。

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

        8
  •  1
  •   Peter D    17 年前

    您是否研究过使用APC检查进度和总文件大小。这里是一个 good blog post 关于它。也许有帮助。

        9
  •  1
  •   Aiden Bell    17 年前

    也许你可以在浏览器中使用webdav和javascript

    Ajax大文件上传到WebDAV

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

    一个简单的图书馆

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

    然后,您可以让JS将用户重定向到成功页面。在关闭JS客户机之前,在PHP序曲中不能处理的密钥和内容--gt;WebDAV

        10
  •  1
  •   Phill Pafford    17 年前

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

        11
  •  1
  •   Andrew Ensley    17 年前

    我已经成功了 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,它是为这个设计的),你可能无法得到你想要的。

    在给定的限制条件下,我已经尽了最大努力。抱歉,我做不好。

        12
  •  0
  •   Jiaaro    17 年前

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

    作为土坯 howto on flash file uploads

    我也在codeproject上找到了这个教程:

    Multiple File Upload With Progress Bar Using Flash and ASP.NET

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

        13
  •  -1
  •   Henry R.    13 年前

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