【问题标题】:Overcome host's max file size limit for PHP/POST data when uploading files?上传文件时克服主机对 PHP/POST 数据的最大文件大小限制?
【发布时间】:2011-06-20 04:01:49
【问题描述】:

我目前使用的是一个相当平庸的低成本(共享)主机(因为这是我现在所能负担的),并且想在页面上实现一个非常基本的文件上传功能。我想允许最大 100MB 的文件上传到服务器,但我的免费主机将 PHP_MAX_FILESIZE 限制为 32MB,将 POST_FILESIZE 限制为 64MB。

有没有什么方法可以在不要求用户将较大的文件分成较小的块的情况下克服这个问题?是基于 JavaScript 或基于 Flash 的解决方案,它可能以某种方式通过不同的 HTTP 请求路由文件的某些部分,还是以其他方式绕过 32MB 限制?

或者我可以尝试执行哪些命令可能会超越主机的限制?我已经尝试使用 .htaccess 没有成功。编辑:也试过ini_set。我认为唯一的方法是某种分块/拆分/多流或其他解决无法设置更高 PHP 值的方法。

非常感谢任何建议。谢谢。

【问题讨论】:

  • 如今,您可以以与共享主机大致相同的价格获得低成本 VPS。没有更多的限制:)
  • 谢谢你,mfonda - 我确实考虑过。但是我的预算非常有限,我每 只能负担 25 美元。 :(

标签: php html post upload


【解决方案1】:

一些主机允许使用 php.ini 的本地副本(例如我的),因此您可以随意更改参数。 请记住,每个文件 100MB 可能会使您的主机迅速膨胀,尤其是如果它不是顶级文件,所以要小心。

【讨论】:

    【解决方案2】:

    也许还可以使用ini_set('upload_max_filesize','100M');

    但我有一个隐秘的怀疑,你的主人可能不喜欢你试图绕过他们的限制......

    【讨论】:

    • 你也可能不得不用 set_time_limit(0) 来增加你的脚本超时时间
    • 这两个指令都是PHP_INI_PERDIR - 无法通过ini_set进行更改
    • 我不一定介意试图超越其限制的后果;这是因为他们在我购买该计划之前没有宣传所述限制,并且基本上拒绝向我提供退款,因为我现在已经有几个月的时间了。我试过 ini_set 没有成功。谢谢。
    • 他们可以阻止您更改任何指令。那是php_admin_value
    【解决方案3】:

    如果您的“免费主机”已经限制了您,您将无能为力。试试看

    http://www.php.net/manual/en/ini.core.php#ini.post-max-size

    http://www.php.net/manual/en/ini.core.php#ini.upload-max-filesize

    这里是你可以在运行时(ini_set)或不设置它的地方

    http://www.php.net/manual/en/configuration.changes.modes.php

    我建议你只做多个文件上传。 100MB 对吧?您打算主持视频和电影吗?尝试寻找更好的付费主机而不是免费主机:)

    【讨论】:

      【解决方案4】:

      【讨论】:

      • 第二个看起来很合法。
      【解决方案5】:

      由于ini_set 似乎不起作用,您可以尝试通过 .htaccess 文件进行设置。我不确定确切的语法,但它涉及php_flag。 如果这也不起作用,我不会感到惊讶。

      根据我的经验,根据他们的广告选择一个好的主机是不可能的。我知道除了简单地尝试一堆并希望你遇到一个不是超级保持力的方法之外别无他法。

      上传限制是一个常见的问题。如果您的客户上传非常大的文件很常见,那么考虑其他一些托管计划可能是明智之举。如果它根本不是很常见,您可以让他们将文件发送给您,以便您可以通过 FTP 传输它。 有时最好的解决方案是最简单的解决方案

      【讨论】:

        【解决方案6】:

        如果您的主机允许 java 小程序,那么在 sourceforge 中已经有它的包。它允许您通过 Java 小程序通过小包从用户机器到您的主机的 dw 文件。它之所以有效,是因为 applet 在用户机器中处理文件上传代码,在服务器端您将收到小块,您可以稍后绑定这些小块,并且可以上传任何大小的文件。

        我在这里找到了链接, http://sourceforge.net/projects/juploader/

        【讨论】:

          【解决方案7】:

          您可以让您的用户上传到外部站点。然后给你那个外部站点的 URL。如果您有足够的空间,您可以通过将文件下载到您站点中的目录来规避外部站点保留文件的时间。 这当然不是最佳选择,但您的用户将拥有更大的上传配额和更快的上传速度(共享服务器和油水混合速度)。

          【讨论】:

            【解决方案8】:

            摘要:

            1) 在发送之前读取文件(捕捉到 onsubmit 事件);拆分并将块作为文本区域字段发送。

            2) 在服务器端,恢复块,并制作一个文件。

            建议:

            根据脚本运行的环境和文件所在的位置,您的选项包括:

             XMLHttpRequest
            

            对象(用于读取通过您网站上的 URL 获得的文件)

             FileSystemObject
            

            (如果您在受信任的环境中使用 Windows Scripting Host 或 Internet Explorer)为您的脚本读取文件或 URL 的“助手”Java 小程序。

            (摘自http://www.javascripter.net/faq/reading2.htm

            如果没问题,删除表单的输入文件元素。

            然后,将字符串分成许多块。

            mySplitResult = myReadedDocument.split( 1024 * 1024 ); // 1M each
            

            生成文档的数组:

            将值添加到表单中(记住使用 [] 为所有新控件设置相同的名称)。假设表单 id 是 'myForm':

            formName = document.getElementById('myForm');
            
            mySplitResult.forEach(function(item) {     
                ta = document.createElement('textarea');
                ta.appendChild(document.createTextNode(item))
                ta.setAttribute("name", "chunk[]" );
                formName.appendChild(ta);
            

            });

            在服务器端,您可以重构块并保存为文件。

            <?php
                $chunks = $_POST['chunk'];
                $fileContent = implode( '', $chunks );
                file_put_content( 'dirname/filename.foo', $fileContent );
            ?>
            

            成功的关键在于你可以在客户端读取文件。

            祝你好运!

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2013-10-19
              • 1970-01-01
              • 1970-01-01
              • 2012-09-02
              • 1970-01-01
              • 2012-04-26
              相关资源
              最近更新 更多