PHP图像在目录和数据库中进行哈希

时间:2018-01-27 17:45:54

标签: php mysql mysqli

上传时我仍然无法浏览照片。我有这段代码:

$target_dir = "images/uploads/";
$target_file = $target_dir . basename($_FILES["fileToUpload"]["name"]);
$uploadOk = 1;
$imageFileType = pathinfo($target_file,PATHINFO_EXTENSION);
   hash_file('sha256', $target_file );

  // Check if image file is a actual image or fake image

      if(isset($_POST["change"])) {

    move_uploaded_file($_FILES["fileToUpload"]["tmp_name"], $target_file);
    $sql = "UPDATE users SET userPic = '".$_FILES['fileToUpload']['name']."' WHERE username = '" . $username . "'";

    $check = $conn->query($sql);

    if($check !== false) {
    echo "<a href = profile.php> Profile pciture has been changed </a>" . 
    $check["mime"] . ".";
    $uploadOk = 1;

    } else {
    echo "File is not an image.";
    $uploadOk = 0; 
    }
    } else {

     echo"did not change";

     }

我收到此错误:

Warning: hash_file(images/uploads/english_royal_family_tree.jpg): failed to open stream: No such file or directory

我已经尝试了一个多星期。没有人真正帮助,人们只是继续对我的问题进行投票,并没有给予任何帮助。有人可以帮助我吗?

1 个答案:

答案 0 :(得分:3)

首先hash_file()期待文件已经存在,并且您在文件上传之前尝试使用该方法;这就是你的代码失败并将错误抛给你的原因。

您需要做的是查看该文件是否存在,然后将其哈希。

如果您真的想要这样做,那么您可以根据以下内容进行操作,并记住在保留原始扩展名的同时存储重命名的文件;答案的最后有链接。

注意:正如我在评论中提到的,您需要散列文件而不是整个目标文件夹文件。这是不可能的。

回显变量以分配给hash_file()。您还将显示(仅)显示的哈希名称减去其扩展名。

检查错误并确保该文件夹已被授予适当的权限。

<?php 

// check for errors
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);

$file_name = $_FILES['fileToUpload']['name'];
$sent_file = move_uploaded_file($_FILES["fileToUpload"]["tmp_name"], $target_file);

 if (file_exists("images/uploads/" . $_FILES["fileToUpload"]["name"]))
  {
  echo $the_file = $_FILES["fileToUpload"]["name"] . " exists.";

    // its new location and hashing the filename only.
   $var = hash_file('sha256', $the_file );
   echo $var;

   // store your renamed file here in your database
   // using the assigned $var variable.

  }

同时使用mysqli_error($conn)检查查询错误。

然而,你最终会遇到问题,以显示该图像,因为现在和例如在使用“file.jpg”时会产生以下哈希:

  

cf80cd8aed482d5d1527d7dc72fceff84e6326592848447d2dc0b0e87dfc9a90

我不知道你打算如何展示图片,但它将不再保留.jpg扩展名。

为了保留图片的文件扩展名,您基本上需要重命名上传的文件。

以下是Stack 的一些很好的参考资料(我过去已经取得了成功),您可以在代码中查看并实现它。 :

确实没有更好的学习方法,恕我直言。

编辑:

这是我最近写的一个剧本的摘录。基于以下内容。

注意:您不应该使用散列方法,例如来自SHA系列或MD5的任何东西作为文件名,因为它们产生相同的散列并且没有唯一性。

重要提示:如果用户从移动设备上传,其中大多数都会将“image.jpg”作为默认名称,因此需要重命名并提供一种独特的方法。

使用日期和时间是一种方式。您也可以通过为其添加变量并附加到新文件名来添加uniqid(),或者MD5和uniqid()的组合是一个不错的选择。

当然,您需要对其进行一些修改。 $year变量是我使用的,但你可以摆脱这些实例并用你自己的实例替换它们。

$year = date("Y");
$pdf_file = $_FILES['fileToUpload']["name"];

$uploaded_date = date("Y-m-d_h-i-s_A"); // this could be another unique method.

$target_dir = "../upload_folder/" . $year . "/";

$ext = explode('.',$_FILES['fileToUpload']['name']);
$extension = $ext[1];

$newname = $ext[0].'_'.$uploaded_date;

$full_local_path = $target_dir.$newname.'.'.$extension;
$new_full_name = $newname.'.'.$extension;

    if (move_uploaded_file($_FILES["fileToUpload"]["tmp_name"], $full_local_path)) {
        echo "The file ". $newname . " has been uploaded.";
        echo "<hr>";

$file_link = "/upload_folder/$year/$new_full_name";

    // other code such as saving to a database...

    }