设置最大值文件上载的文件大小在上载后返回空白页面

时间:2011-10-04 04:49:12

标签: php forms file-upload filesize

更新:我已经清理了我的表单和图片验证了一下。我放弃了寻找图像扩展的原始方法,并首先使用getimagesize()验证上传的文件是图像。从那里,我通过使用pathinfo()抓取扩展并将其与包含jpg和jpeg的数组匹配,确保图像是jpg或.jpeg。

然后我确保文件已成功上传,然后成功从临时位置移动到我设置的位置。下一步是使用“imagecreatefromjpeg”创建新图像,但我收到错误

  

致命错误:第48行的FILENAME.php中允许的内存大小为33554432字节(尝试分配13056字节)

这是我感到困惑的地方,因为我试图上传的图片远低于我的最大文件大小2MB(图像是410k)。不太确定为什么它超过了我的服务器所在的32MB内存限制。

    <?php

if(isset($_POST['uploadImage'])){

    //  set variables for uploaded file
    $uploadTempPath = $_FILES['uploadFile']['tmp_name'];
    $uploadSize = $_FILES['uploadFile']['size'];
    $uploadLimit = 2097152; /* 2mb max file size */
    $uploadName = strtolower($_FILES['uploadFile']['name']);    // grab upload filename and lowercase the extension (.JPG -> .jpg)

    //  check if something was uploaded
    if (empty($uploadTempPath)){
        echo '<script language="JavaScript">';
        echo 'alert("You did not upload anything!!")';
        echo '</script>'; 
        $errors .= 'You did not upload an image <br>';
    }

    // if all required fields were filled and a file was actually selected to upload
    if (empty($errors)) :

        //  1A.  Check that file uplaoded is a valid image
        if ( getimagesize($_FILES['uploadFile']['tmp_name']) ) :

            //  2B.  Verify that image extension was a jpg or jpeg
            $imgExt = pathinfo( $_FILES['uploadFile']['name'] , PATHINFO_EXTENSION );
            $validExt = array( 'jpg', 'jpeg' );
            if ( in_array($imgExt, $validExt) ) :

                //  3A.  Make sure image was uploaded successfully
                if (is_uploaded_file($_FILES['uploadFile']['tmp_name'])) :

                    $uploadPath = 'images/uploads/';
                    $imgWidth = '620';
                    $imgFilename = pathinfo( $_FILES['uploadFile']['name'] , PATHINFO_BASENAME );
                    $newPath = $uploadPath . $imgFilename;

                    //  4A.  Move uploaded file from temporary path to new path
                    if(move_uploaded_file ($uploadTempPath , $newPath)) :

                        $img = imagecreatefromjpeg($newPath);

                        // PRINT OUT INFORMATION IF ALL IS CORRECT SO FAR
                        echo 'File was moved <br>'; 
                        echo 'Maximum file size: ' . $uploadLimit . '<br>';
                        echo 'Uploaded file size: ' . $uploadSize . '<br>';
                        echo 'Filename: ' . $imgFilename . '<br>';
                        echo 'New Path: ' . $newPath . '<br>';
                        echo 'File extension: ' . pathinfo($_FILES['uploadFile']['name'], PATHINFO_EXTENSION) . '<br>';

                    //  4B.  Image was not successful in being moved
                    else : 

                        echo 'Image was NOT moved! <br>'; 

                    endif; //  END 4

                //  3B.  Image was not uploaded.. 
                else :

                    // beware of an ATTACK!
                    echo 'Image was not uploaded. <br>';

                endif; //  END 3

            //  2B.  File was not a jpg or jpeg 
            else :

                echo '<script language="JavaScript">';
                echo 'alert("Your image is not a jpeg! Its a ' . pathinfo($_FILES['uploadFile']['name'] , PATHINFO_EXTENSION) . '")';
                echo '</script>'; 
                $errors .= 'NOT A JPEG! <br>';

            endif; //  END 2

        //  1B.  File uploaded was not a valid image
        else :

            echo '<script language="JavaScript">';
            echo 'alert("Invalid Image!")';
            echo '</script>'; 
            $errors .= 'The file you uploaded is not a valid image file <br>';

        endif; //  END 1

    endif; // endif empty errors

}   

?>

3 个答案:

答案 0 :(得分:0)

这是因为整个文件作为变量进入缓存 尝试上传较小的图像,你会发现它工作正常。

好吧,你必须增加内存大小。 但这是你在做之前应该三思而后行(安全性)。

ini_set("memory_limit","350M");// or any thing you want here

//run the script here...

ini_set("memory_limit","128M");//back to normal

答案 1 :(得分:0)

扩展我的评论,如果您遇到最大文件大小等错误,则不会停止执行脚本。不要依赖html表单来实际停止上传(顺便说一下,如果图像大于允许的话,它会无声地失败)。在你的php中,你只需要创建一个错误索引,但你继续进行图像处理。

此外,由于以下几个原因,您的图片验证非常糟糕:

1) preg匹配,如果它包含扩展名是非常差的验证,如果没有的话。

尝试上传shell.php.jpg,你会明白为什么;)检查图像是否有效的最佳方法之一是使用getimagesize(),它会为你提供一个包含7个元素的数组许多有用的信息,除了告诉你图像是真实的图像。

如果我保存带有png扩展名的jpg图像怎么办?我会欺骗你的脚本寻找一个png,而不是它是一个jpg。这将轻易打破你的imagecreate *功能。

2)你获得扩展的方式有问题,像my.picture.jpg这样的文件会轻易破坏它。

您可以使用pathinfo($file, PATHINFO_EXTENSION)获取该信息;这个函数也会得到一个正确的文件名,dirpath等,它比任何自制的剥离,stroposing和诸如此类的东西都更可靠

3)PNG和GIF应该需要上瘾治疗,如saving the alpha channel;你会丢失像这样的透明图片。

要扩展内存限制,请按照建议使用ini_set("memory_limit","VALUE HERE")。但请记住,通常这不是一个问题,如果不是大图像,所以还有其他东西导致麻烦。如果你在那里修改代码,你甚至不需要使用这个“hack”;此外,扩展它确实意味着你分配了更多的资源(比应该分配),你的脚本可能不会失败,但并不意味着你的脚本更好

哦,另一个:你是否偶然将图像存储在数据库中,作为一个blob字段? (目前尚不清楚你在使用INSERT语句做什么)。我建议只保存数据库中varchar的路径,原因很多(性能,数据完整性等),在db字段中插入图像的整个二进制文件并不是最好的策略。

答案 2 :(得分:0)

首先让我们修复一些小错误:你应该在文件名regex中转义句点以匹配实际的句号;然后你应该在你真正使用它之前检查并创建$ uploadNewPath目录。并且您可以尝试在tmp文件上使用imagecreatefromX,而不会将它们实际移动到新位置,因为您尝试使用新的已调整大小的图像覆盖它们。

相关问题