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

Php 设置文件上载的最大文件大小会在上载后返回空白页,php,forms,file-upload,filesize,Php,Forms,File Upload,Filesize,更新:我已经清理了我的表单和图像验证。我放弃了最初查找图像扩展名的方法,首先使用getimagesize()验证上传的文件是否为图像。从那里,我使用pathinfo()抓取扩展名并将其与包含jpg和jpeg的数组进行匹配,从而确保图像是jpg或.jpeg 然后,我确保文件已成功上载,然后成功地从临时位置移动到我设置的位置。下一步是使用“imagecreatefromjpeg”创建新图像,但我收到了错误 致命错误:第48行FILENAME.php中允许的内存大小33554432字节已用完(尝试分配

更新:我已经清理了我的表单和图像验证。我放弃了最初查找图像扩展名的方法,首先使用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

}   

?>

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

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


展开我的注释,如果遇到“最大文件大小”之类的错误,则不会停止脚本执行。不要依赖html表单来实际停止上传(顺便说一句,这会无声地失败),以防出现比允许的更大的图像。在php中,您只需创建一个错误索引,但仍然需要继续处理图像

此外,由于以下几个原因,您的图像验证非常差:

1) 如果包含扩展名,则preg匹配是一个非常糟糕的验证,如果根本没有

尝试上传shell.php.jpg,您将看到原因;)检查图像是否有效的最佳方法之一是使用,它将为您提供一个包含7个元素的数组,其中包含许多有用信息,并告诉您该图像是真实图像。

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

2) 获取扩展名的方法有问题,像my.picture.jpg这样的文件很容易破坏扩展名

您可以使用来获取该信息;此函数还将获得正确的文件名、目录路径等,并且比任何自制的剥离、存储等功能更可靠

3) PNG和GIF应该需要成瘾治疗,比如;你会失去你的图像,像这样的透明胶片

要扩展内存限制,请按照建议使用ini设置(“内存限制”、“此处的值”)
。但请记住,通常情况下,在没有大图像的情况下,这不是一个问题,因此还有其他一些问题会造成麻烦。如果你在那里修补代码,你甚至不需要使用这个“黑客”;此外,扩展它确实意味着您分配了更多的资源(比应该分配的资源要多),您的脚本可能不会失败,但这并不意味着您的脚本更好


哦,另一个问题:您是否碰巧将图像存储在数据库中,作为一个blob字段?(不清楚您对INSERT语句做了什么)。我建议只在数据库中保存varchar的路径,原因有很多(性能、数据完整性等),在数据库字段中插入图像的整个二进制文件不是最好的策略。

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

请打开错误:
错误报告(E\u ALL)
ini\u集('display\u errors',1)然后在问题中发布,这可能是运行时的错误。1)如果出现错误,您不会停止脚本,因此无论发生什么,您都将继续调整大小。2) 您的图像验证非常差。您可以在submit.php中指出第40行吗?第40行:如果(preg_match('/[.](jpg)|(jpeg)$/',$uploadNewName)){$img=imagecreatefromjpeg($uploadNewPath.$uploadNewName);}您似乎耗尽了这里的所有可用内存:)谢谢,达米恩。如果我上传一个名为
shellfile.picture.png.jpg的shell脚本,我会清理验证并查看getimagesize()和pathfile(),我会让你的脚本放松它,所以是的,加强验证是第一步。
ini_set("memory_limit","350M");// or any thing you want here

//run the script here...

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