上传时我仍然无法浏览照片。我有这段代码:
$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
我已经尝试了一个多星期。没有人真正帮助,人们只是继续对我的问题进行投票,并没有给予任何帮助。有人可以帮助我吗?
答案 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...
}