【问题标题】:Uploaded images don't save in destination folder上传的图像不保存在目标文件夹中
【发布时间】:2021-12-23 20:06:47
【问题描述】:

我是新来的,很高兴认识你。

我正在尝试创建用户在安全检查后上传的图片的干净副本,并将此副本保存在指定文件夹和我的数据库中。我正在 Windows 10 上使用 XAMPP,并且我为所述文件夹授予了正确的权限。我的代码如下:

/*bit of code for picture addition, in a function for album publication*/
if($_FILES['albumCover']['error'] === 0) {
    $covType;
    $createCover;
    $covName = guidv4();

    $imgRegex = '/^[a-z\d][^.]*\.(jpe?g$)|\.(png$)/i';

    $covInfo = finfo_open(FILEINFO_MIME_TYPE);
    $covMime = finfo_file($covInfo, $_FILES['albumCover']['tmp_name']);
    finfo_close($covInfo);

    if(!preg_match($imgRegex, $_FILES['albumCover']['name']) ||
       str_contains($_FILES['albumCover']['name'], ' ') ||
       in_array($_FILES['albumCover']['type'], ['image/jpeg','image/png'])||
       strpos($covMime, 'image/') !== 0) 
    {

        $addMessages['errors'][] = 'Caractère autorisé pour le nom d\'image : lettres sans 
              accent / sans trémas / sans cédille, chiffres, tirets et underscores. Fichiers
              autorisés : images .jpg, .jpeg ou .png.';
    }

    if(empty($addMessages['errors'])) {

        if(preg_match($imgRegex, $_FILES['albumCover']['name'])
             && $_FILES['albumCover']['type'] == 'image/jpeg'
             && strpos($covMime, 'image/') !== 0) 
        {

            $covType = 'jpeg';
            $createCover = imagecreatefromjpeg($_FILES['albumCover']['tmp_name']);

            imagejpeg($createCover,
                self::COV_SECURE_PATH.$covName.'.'.pathinfo($_FILES['albumCover']['name'], 
                      PATHINFO_EXTENSION)
            );

            move_uploaded_file($_FILES['albumCover']['tmp_name'],
            self::COV_SECURE_PATH.'/'.$_FILES['albumCover']['name']);
        } elseif(preg_match($imgRegex, $_FILES['albumCover']['name'])
                && $_FILES['albumCover']['type'] == 'image/png'
                && strpos($covMime, 'image/') !== 0) 
        {

            $covType = 'png';
            $createCover = imagecreatefrompng($_FILES['albumCover']['tmp_name']);

            imagepng($createCover,
                    self::COV_SECURE_PATH.$covName.'.'.pathinfo($_FILES['albumCover']['name'],
                   PATHINFO_EXTENSION));

            move_uploaded_file($_FILES['albumCover']['tmp_name'],
            self::COV_SECURE_PATH.'/'.$_FILES['albumCover']['name']);
        }
    }
}

更多细节:上面的代码是类方法的一部分。常量 COV_SECURE_PATH 在类中声明,在方法之前。并且图片名称的guidv4()函数在同一个文件中,在类的声明之前。

我没有 PHP 错误消息,我的打印显示每个文件的正确名称和扩展名,并且我在 HTML 表单中声明了属性 enctype="multipart/form-data"。图片保存在我的数据库中(如果需要,我将添加有关数据库的代码),但它们不会保存在我的文件夹中,我不知道我缺少什么。到目前为止,我在任何网站上搜索时都没有找到答案,非常感谢任何帮助。

【问题讨论】:

  • 我授予了上述文件夹的正确权限 在 Windows 上,您通常无需执行任何操作。你能证明你做了什么吗?
  • 如何将else 添加到if - elseif,这样当代码没有进入 if 或 elseif 时,您会收到错误或某种通知
  • imagepng() / imagejpeg() 创建一个文件,move_uploaded_file() 复制该文件,你真的想要每个文件 2 个吗?
  • 您在imagejpeg 中有路径self::COV_SECURE_PATH.$covName,在move_uploaded_file 中有self::COV_SECURE_PATH.'/'。函数guidv4() 是否在$covName 中添加斜线?
  • 您好,感谢您的回答。我不确定 move_uploaded_file() 是否必要,但我想尝试一下,因为 imagepng() / imagejpeg() 不起作用。所以我将删除 move_uploaded_file()。我只是为文件夹和父文件夹中的权限做了一个 chmod 777 。并且 guidv4() 函数不会在 $covName 中添加斜杠。

标签: php file-upload saving-data


【解决方案1】:

好吧,我终于解决了所有问题。我的错误是:if(preg_match($imgRegex, $_FILES['albumCover']['name']) && $_FILES['albumCover']['type'] == 'image/jpeg' && strpos($covMime, 'image/') !== 0) {

而不是if(preg_match($imgRegex, $_FILES['albumCover']['name']) && $_FILES['albumCover']['type'] == 'image/jpeg' && strpos($covMime, 'image/') === 0) {

而且我还意识到我没有在我的 php.ini 中激活 GD,现在它已经完成了。 感谢所有回答我的人!

【讨论】:

    【解决方案2】:

    看看我的图像验证...

    //connecting to the database
    $mysqli = mysqli_connect( 'localhost', 'root', '', 'img_validation' )
    or
    die( 'Database connection error => '.mysqli_connect_error() );
    
    //errors and success message handling
    $errors = array();
    $success = array();
    
    //imgs dir
    $imgs_dir = './assets/imgs/';
    
    //if upload button is pressed...
    if ( isset( $_POST['upload'] ) ) {
    
        //get image info...
        $imgName = $_FILES['image']['name'];
        $imgTmp = $_FILES['image']['tmp_name'];
        $imgSize = $_FILES['image']['size'];
    
        //image validation
        if ( $imgName ) {
            //get extension info
            $imgExt = strtolower( pathinfo( $imgName, PATHINFO_EXTENSION ) );
            //allowed image extensions
            $allowExt  = array( 'jpg', 'jpeg', 'png' );
            //create new random image name
            $uploadedPic = 'user-upload-'.rand( 100000, 999999 ).'.'.$imgExt;
    
            //validate image extension
            if ( in_array( $imgExt, $allowExt ) ) {
                //max image upload size 3MB
                if ( $imgSize < 3000000 ) {
                    //move image file to designated directory/folder
                    move_uploaded_file( $imgTmp, $imgs_dir.$uploadedPic );
                } else {
                    array_push( $errors, "Image too large. Max. upload size 3MB." );
                }
            } else {
                array_push( $errors, "<script type='text/javascript'>
                alert('JPG, JPEG and PNG formats required.\\nMax. upload size 3MB.');</script>" );
                array_push( $errors, "Please select a valid image." );
            }
        } else {
            $uploadedPic;
        }
    
        //if found no errors...
        if ( count( $errors ) == 0 ) {
            //insert new record in `user_uploads` table in the database...
            $admin = mysqli_query( $mysqli, "INSERT INTO user_uploads (image) VALUES ('$uploadedPic');" );
            if ( $admin == 1 ) {
                //success message
                array_push( $success, "Image uploaded successfully." );
                //redirect to profile after 2 seconds...
                header( 'refresh: 2; url=http://localhost/img-validation/' );
            } else {
                array_push( $errors, mysqli_error() );
            }
        }
    }
    

    当我在PHP的早期学习阶段,我写了这段代码,希望它对你有用:)

    【讨论】:

    • 您好,塔巴萨姆,谢谢。是的,我在最近的初级 Web 开发培训课程中使用了类似的代码。 :) 现在,我正在构建我的第一个“真实”站点,因此我试图让事情变得比我为通过考试而交付的站点更安全。因此,我尝试使用 imagecreatefrom(),但这似乎不起作用。至于大小、扩展名和名称检查,以及在我的数据库中的保存,我的代码也可以。
    • @WilleB 兄弟,我的脚本将只存储数据库中user_uploads 表中的随机图像名称,该表存储在$uploadedPic 变量中。实际图像将存储在您的本地计算机上,我的意思是在您指定的文件夹中。希望你明白:)
    • 是的,我知道:),看来我没有回答清楚,抱歉。我正在尝试创建上传图像的干净副本,并使用函数 imagecreatefrom() 和 imagepng() / imagejpeg() 将此副本保存在我指定的文件夹中,而不是使用函数 move_uploaded_file。
    • 好的,我发现并纠正了我的一个愚蠢错误。现在我得到这个 PHP 错误:“调用未定义的函数 App\controller\imagecreatefromjpeg()”。我会搜索如何解决它。
    • 调试是一件令人头疼的事情,当您调试自己的代码时会变得更加有趣; ) 好吧,恭喜你完成了,祝你考试好运。
    猜你喜欢
    • 2014-03-12
    • 2016-01-09
    • 2020-01-14
    • 2021-10-24
    • 1970-01-01
    • 1970-01-01
    • 2018-09-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多