【问题标题】:Setting Max. File Size for File Uploads Returns Blank Page After Upload设置最大值文件上传的文件大小在上传后返回空白页
【发布时间】:2011-10-04 04:49:12
【问题描述】:

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

}   

?>

【问题讨论】:

  • 请打开错误:error_reporting(E_ALL);ini_set('display_errors' , 1);,而不是在您的问题中发布,这可能是运行时的一些错误。
  • 1) 如果出现错误,您不会停止脚本,因此无论如何您都将继续调整大小。 2)你的图片验证很差
  • 您能在 submit.php 中指出第 40 行吗?
  • 第 40 行: if ( preg_match ('/[.](jpg)|(jpeg)$/' , $uploadNewName )) { $img = imagecreatefromjpeg($uploadNewPath . $uploadNewName); }
  • 你似乎在这里耗尽了所有可用内存:)

标签: php forms file-upload filesize


【解决方案1】:

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

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

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

//run the script here...

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      扩展我的评论,如果您遇到最大文件大小等错误,您不会停止脚本执行。不要依赖 html 表单来实际停止上传(顺便说一句,它会默默地失败),以防图像比允许的更大。在你的 php 中,你只是创建了一个错误索引,但你仍然继续你的图像操作。

      此外,您的图像验证很差,原因有以下几个:

      1) 如果预匹配包含扩展名,则验证非常差,如果根本没有。

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

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

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

      您可以使用pathinfo($file, PATHINFO_EXTENSION) 获取该信息;此函数还将获得正确的文件名、目录路径等,并且它比任何自制剥离、stroposing 和诸如此类更可靠

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

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

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

      【讨论】:

      • 谢谢,达米安。我将清理验证并查看 getimagesize() 和 pathfile()
      • 如果我上传一个名为 shellfile.picture.png.jpg 的 shell 脚本,我会让你的脚本放松,所以是的,加强验证是第一步。
      猜你喜欢
      • 1970-01-01
      • 2019-12-16
      • 1970-01-01
      • 2019-12-05
      • 2016-09-29
      • 2014-04-04
      • 2020-01-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多