上传文件时克服主机对PHP / POST数据的最大文件大小限制?

时间:2011-02-02 18:02:30

标签: php html post upload

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

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

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

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

8 个答案:

答案 0 :(得分:2)

答案 1 :(得分:1)

也可能能够使用ini_set('upload_max_filesize','100M');

但是我怀疑你的主人可能对你试图规避他们的限制感到不满......

答案 2 :(得分:1)

如果您的“免费主持人”已经限制了您,那么您无能为力。试试看

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

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

答案 3 :(得分:1)

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

我发现这里的链接是, http://sourceforge.net/projects/juploader/

答案 4 :(得分:0)

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

答案 5 :(得分:0)

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

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

上传限制是常见的问题。如果您的客户上传非常大的文件很常见,那么查看其他主机方案也许是明智之举。如果它不是很常见,你可以让它们发送给你文件,这样你就可以FTP了。 有时最好的解决方案是最简单的解决方案

答案 6 :(得分:0)

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

答案 7 :(得分:0)

摘要:

1)在发送之前读取文件(catch into onsubmit event);拆分并将块作为textarea字段发送。

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

提案:

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

 XMLHttpRequest

对象(用于读取您网站上的URL提供的文件)

 FileSystemObject

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

(摘自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 );
?>

成功的重要性在于您可以在客户端读取文件。

祝你好运!