【问题标题】:Image isn't rendering when using it's file name without the extension in src=""使用没有 src="" 扩展名的文件名时,图像不会呈现
【发布时间】:2018-03-31 16:53:50
【问题描述】:

我看到了一些关于与此问题相关的内容类型的帖子,但我不知道如何处理这些信息。所以我写这篇文章希望能对我的具体问题有所帮助。

这是我用 PHP 编写的 HTML:

<div class="hello-text">
    <?php
        if($_SESSION['fname'] != ""){
            $result = glob ("users/" . $_SESSION['user_id'] . "/profile_picture.*");
            if($result){
                echo "users/" . $_SESSION['user_id'] . "/profile_picture";
                echo "<div style='height: 50px; width: 50px;  overflow-x: hidden;'><img src= 'users/" . $_SESSION['user_id'] . "/profile_picture' style='height:100%;'></div>";
            }else{
                echo "<form action='pp_upload.php' method='POST' enctype='multipart/form-data'><input type='file' onchange='this.form.submit()' name='image' id='file-input' style='display: none;'/><label for='file-input'><img src='images/set-profile-picture.jpg' style='height:50px; cursor: pointer;'></label></form>";

            }
            echo " Hello, " . $_SESSION['fname'] . " ";
        } else {
            echo "Please enter your details using the 'change' link below ";
        }           
    ?>
</div>

基本上我想做的是将用户的个人资料图片呈现在一个字符串旁边,上面写着“你好,[用户的名字]”。最初 if 语句不起作用,但我通过使用 glob() 函数解决了这个问题。现在,当我尝试通过在文件结构中查找图像(使用他们在数据库中的用户 ID)来渲染他们的个人资料图片时,它无法渲染图像。我猜这是因为我没有图像名称的扩展名,但我不能确定。

由于我允许用户上传任何文件类型的图像,因此我没有 URL 上的文件扩展名。如果用户没有头像,那么它将触发else 语句,该语句会呈现一个图像,他们可以单击该图像来上传他们的头像。如果用户在数据库中没有名字,那么它将要求他们在页面底部的表格中输入他们的名字。

以下是用户上传个人资料图片时运行的内容:

<?php
session_start();
if(isset($_FILES['image'])){
  $errors= array();
  $file_name = $_FILES['image']['name'];
  $file_size =$_FILES['image']['size'];
  $file_tmp =$_FILES['image']['tmp_name'];
  $file_type=$_FILES['image']['type'];
  $file_ext=strtolower(end(explode('.',$_FILES['image']['name'])));

  $expensions= array("jpeg","jpg","png");

  if(in_array($file_ext,$expensions)=== false){
     $errors[]="extension not allowed, please choose a JPEG or PNG file.";
  }

  if($file_size > 2097152){
     $errors[]='File size must be excately 2 MB';
  }

  if(empty($errors)==true){
     move_uploaded_file($file_tmp,"users/" . $_SESSION['user_id'] . "/" . $file_name);
      rename("users/" . $_SESSION['user_id'] . "/" . $file_name, "users/" . $_SESSION['user_id'] . "/profile_picture." . $file_ext);
     echo "Success";
  }else{
     print_r($errors);
  }
}

【问题讨论】:

  • 您的glob() 会检查profile_picture.*,即“profile_picture”,然后是句点和其他内容。因此,将您的 &lt;img src=""&gt; 设置为“profile_picture”不会指向现有文件。您应该检查 $result 中的内容,并可能将其设置为图像的 src
  • 如果用户至少有1张图片,并且在上传新图片时删除了旧图片,您可以使用$result[0]来操作src的路径。
  • @rickdenhaan if 语句不是问题,它通过了检查。图像标签不起作用。我可以把它放在 if 语句之外,它仍然不起作用。
  • @VeteranLK 问题不在 if 语句中。结果变量不影响 img 标签。
  • @AdamCole,重命名发生在哪里?我在您的代码中没有看到类似的内容。

标签: php html image


【解决方案1】:

你的头像不叫profile_picture,而是叫

  • profile_picture.jpeg,
  • profile_picture.jpg,或
  • profile_picture.png

当您在 HTML 中引用此文件时,您必须使用完整名称。您的服务器应该如何知道要提供什么文件?

一种方法是使用glob() 的结果:

if ($result) {
    echo $result[0];
}

此值应包含与 glob 模式匹配的第一个文件的路径和文件名,包括其扩展名。

当然,如果用户上传了多张个人资料图片,例如导致目录中同时存在profile_picture.jpgprofile_picture.png,您可能得不到您想要的。一些可能的解决方案是在上传新的个人资料图片文件时删除旧的个人资料图片文件,或将用户个人资料图片的完整路径存储在某处,例如在数据库中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-16
    • 1970-01-01
    • 1970-01-01
    • 2016-12-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多