2012-01-27 83 views
7

我使用的是Apache,PHP。如何在上传过程中停止超大文件上传?

因此,对于PHP,即使我设置了最大文件大小,如果有人上传一个巨大的文件,它会将整个事情上传到服务器,然后PHP返回错误。是对的吗?

我希望Web服务器或PHP在文件大小或请求大小大于特定大小时停止。

有没有办法做到这一点?我记得像设置post_max_size或在apache.conf中设置某些内容,但不知道当文件超过最大限制时它是否会停止。

  • 我不相信客户端验证。所以,我正在寻找apache或php级解决方案。 :)
+0

客户端验证非常用户友好,请查看HTML5 File API。此外,它当然还需要服务器端验证。 – Flimm 2016-08-12 18:22:37

回答

2

不可能从服务器端停止 - 在PHP决定是否拒绝它之前,文件仍将被上传。您需要在客户端添加该检测。虽然无法使用常规的HTML表单进行此操作,但闪存上传器可以在上载开始之前找到文件大小。

在服务器端,您不能对PHP做任何有用的事情 - 在PHP有机会说'不'之前,文件总是已经完全上传。要阻止上传(即通过POST断开客户端部分),您需要一些Web服务器魔术降低堆栈。 Perlbal能够做到这一点。编写你自己的Apache模块是一个(暴力)解决方案。如果您担心大量上传会占用Web服务器资源,那么在您的主Web服务器前使用任何类型的轻量级代理都是解决方案。

这真的取决于为什么要限制较大的上传量。如果是为了节省用户时间,只需添加指定最大文件大小的消息。如果是服务器资源,请在服务器前使用轻量级代理。如果是别的东西,那么它是什么?

+0

永远不会做客户端验证 – ordag 2012-01-27 22:25:57

+0

服务器可以在需要时停止下载。我敢打赌,有一个解决方案,我只是不知道它会有多低。 – FakeRainBrigand 2012-01-27 22:27:19

+13

@ordag,从来没有*依赖*在客户端验证;-) – FakeRainBrigand 2012-01-27 22:28:01

2

max_execution_time和max_input_time 这些设置定义脚本的最长生存时间以及脚本接受输入的时间。如果传输几个兆字节的数据,max_input_time应该相当高。您可以通过调用脚本中的set_time_limit()函数来覆盖max_input_time的ini文件中的设置。

这是从http://www.radinks.com/upload/config.php

采取如果你对这些INI条目上传完成

+1

嗯这是一个工作。 – murvinlai 2012-01-27 23:00:15

+0

max_execution_time完全不包含文件上传。 max_input_time只是* parse *时间,即使对于千兆字节的上传,该时间通常也是次秒。这些设置在这里没有帮助。 – Cal 2012-01-27 23:08:50

1

使用一个名为MAX_FILE_SIZE的隐藏字段,其值指示最大文件大小(以字节为单位)。 See Example #1 on this page了解更多信息。

<!-- The data encoding type, enctype, MUST be specified as below --> 
<form enctype="multipart/form-data" action="__URL__" method="POST"> 
    <!-- MAX_FILE_SIZE must precede the file input field --> 
    <input type="hidden" name="MAX_FILE_SIZE" value="30000" /> 
    <!-- Name of input element determines name in $_FILES array --> 
    Send this file: <input name="userfile" type="file" /> 
    <input type="submit" value="Send File" /> 
</form> 
+2

'MAX_FILE_SIZE'只是一个自愿的用户指示器,所以浏览器可以警告客户,它不会被强制/强制执行。 – Wrikken 2012-01-27 23:36:37

+0

这就是我最初的想法,但是PHP手册让我认为如果上传太大,立即丢弃。从某种意义上说,如果情况并非如此,但它取决于发送关于文件的“元数据”。我对不正确的信息表示歉意。 – Andy0708 2012-01-28 09:18:53

+0

就浏览器而言,这并没有做任何事情,它所做的只是在POST数据中发送额外的值。请参阅http://stackoverflow.com/q/1381364/247696 – Flimm 2016-08-12 17:26:07

0

在php中使用$ _FILES。

if($_FILES['name']['size'] > $limit){ 
// continue; 
} 
+7

我相信上传完成后将执行此代码。 – Andy0708 2012-01-27 22:46:05

4

Apache's LimitRequestBody,据我所知,它只是去当了....

+4

这有效,但给你一个Apache错误页面,而不是将控制权交给PHP。错误代码为413,可以通过'ErrorDocument'选项来处理。然而,在某些版本中奇怪的Apache错误会导致所请求的页面*被另外*返回给错误文档。野生! – Cal 2012-01-27 23:55:30

+0

要增加趣味性,某些Apache版本将跳过错误页面,并在达到限制时直接关闭连接。某些版本将显示高于限制的特定大小的错误,但在某些其他(任意)限制下关闭连接。 – Cal 2012-01-27 23:58:51

+0

那么,不要在破碎的Apache上运行它:P你当然是对的,它确实不是非常用户友好的。但它确实符合“我希望Web服务器或PHP停止”的法案,选择第一个。除了把一些代理放在网络服务器前,我不知道另一种方法。 – Wrikken 2012-01-28 00:00:30

0

使用一个定时器(超时)与PHP 5的一个会话进度功能每次上传停止连接。5并测量每个上传大小的平均时间。

相关问题