HTML上传MAX_FILE_SIZE似乎不起作用

时间:2011-06-13 08:03:32

标签: php html file-upload

我想知道名为MAX_FILE_SIZE的隐藏字段应该如何工作?

<form action="" method="post" enctype="multipart/form-data">
    <!-- in byes must preceed file field -->
    <input type="hidden" name="MAX_FILE_SIZE" value="2097152" /> 
    <input type="file" name="upload" />

    <input type="submit" name="submit" value="Submit" />
</form>

我上传了一个4MB +的文件,但我没有得到客户端的警告(我不是在谈论服务器端)。 MAX_FILE_SIZE应该做什么?

更新

好的,这样PHP就可以施加“软”限制。但是在使用它和检查代码中的$_FILES['upload']['size'] < 2000这样的东西之间有什么区别吗?

7 个答案:

答案 0 :(得分:43)

MAX_FILE_SIZE位于 KB 字节中。你是对的,它是以字节为单位的。因此,限制为4MB convert 4MB in bytes {1024 * (1024 * 4)}尝试:

<input type="hidden" name="MAX_FILE_SIZE" value="4194304" /> 

enter image description here

更新1

正如其他人所解释的那样,你永远不会收到警告。只是在服务器端施加软限制。

更新2

回答您的子问题。是的,存在差异,您永远不会信任用户输入。如果您想要始终施加限制,您始终必须检查其大小。不要相信MAX_FILE_SIZE的作用,因为它可以被用户更改。所以,是的,你应该检查一下,确保它总是达到或超过你想要的尺寸。

不同之处在于,如果你强加了2MB的MAX_FILE_SIZE并且用户试图上传一个4MB的文件,一旦它们达到大约前2MB的上传量,传输将终止并且PHP将停止接受更多该文件的数据。它将报告文件数组的错误。

答案 1 :(得分:40)

在开始之前,请允许我强调必须检查文件的大小 服务器端。如果未在服务器端进行检查,恶意用户可以覆盖客户端限制,并将大量文件上载到服务器。不要信任用户。

我使用PHP的MAX_FILE_SIZE玩了一下,它似乎只在文件上传后才起作用,这使得它无关紧要(再次,恶意用户可以很容易地覆盖它)。

下面的javascript代码(在Firefox和Chrome中测试)基于Matthew's post,会警告用户(好的,无辜的)上传大文件,节省流量和用户的时间:

<form method="post" enctype="multipart/form-data" 
onsubmit="return checkSize(2097152)">    
<input type="file" id="upload" />
<input type="submit" />

<script type="text/javascript">
function checkSize(max_img_size)
{
    var input = document.getElementById("upload");
    // check for browser support (may need to be modified)
    if(input.files && input.files.length == 1)
    {           
        if (input.files[0].size > max_img_size) 
        {
            alert("The file must be less than " + (max_img_size/1024/1024) + "MB");
            return false;
        }
    }

    return true;
}
</script>

答案 2 :(得分:7)

对于那些曾经对某些文件很容易上传而又有些文件感到不安的人来说,这可能是个大小问题。我正在分享这个,因为我坚持使用我的PHP代码而不上传大文件,我一直认为它没有上传任何Excel文件。因此,如果您正在使用PHP并且想要增加文件上载限制,请转到php.ini文件并进行以下修改:

  • upload_max_filesize = 2M

要改为

  • upload_max_filesize = 10M

  • post_max_size = 10M

或所需的尺寸。然后重新启动Apache服务器,上传将开始神奇地工作。希望这对某人有所帮助。

答案 3 :(得分:4)

实际上,它并没有真正起作用。您可以在手册页的其中一条评论中找到解释:http://www.php.net/manual/en/features.file-upload.php#74692

回答更新的问题:明显不同的是服务器端检查是可靠的,客户端检查不是。

答案 4 :(得分:3)

它只应该将信息发送到服务器。它必须在文件字段之前的原因是它必须在请求中的文件有效负载之前到达,以便服务器能够使用它来检查上载的大小。

如何在服务器上使用该值取决于您用于处理上载的内容。该代码应该用于专门查找该值的特定上传组件。

似乎PHP中的built in upload support是使用此字段值的一个。

答案 5 :(得分:3)

关于MAX_FILE_SIZE隐藏字段的PHP.net说明。

  

MAX_FILE_SIZE隐藏字段(以字节为单位)必须位于文件输入字段之前,其值是PHP接受的最大文件大小。应始终使用此表单元素,因为它可以节省用户等待传输大文件的麻烦,只是发现它太大而传输失败。请记住:在浏览器端愚弄此设置非常简单,因此不要依赖此功能阻止更大尺寸的文件。它仅仅是应用程序客户端用户的便利功能。然而,最大尺寸的PHP设置(在服务器端)不能被愚弄。

http://php.net/manual/en/features.file-upload.post-method.php

答案 6 :(得分:1)

引入MAX_FILE_SIZE客户端隐藏表单字段时有一个要点。

php.ini可以限制上传的文件大小。因此,当您的脚本遵循php.ini强加的限制时,不同的HTML表单可以进一步限制上传的文件大小。因此,在上传视频时,表单可能会将*最大尺寸限制为10MB,而在上传照片时,表单可能会限制只有1mb。同时,可以在php.ini中设置最大限制,假设10mb允许这一切。

虽然这不是告诉服务器做什么的简单方法,但它可能会有所帮助。

  • HTML不限制任何内容。它只是转发服务器的所有表单变量,包括MAX_FILE_SIZE及其值。

希望它有所帮助。