您好我现在能够将文件上传到我网站上的文件夹,但是我无法理解我应该如何从我的文件到我的数据库获取路径...
<?php
if(isset($_FILES['file']) )
{
move_uploaded_file($_FILES['file']['tmp_name'],'files/'.$_FILES['file']['name']);
session_start();
$username = $_SESSION['user'];
$userpic = ???? <-- what am i supposed to call here to put the path to my image file
include ("connect.php");
$sql = $con->prepare('INSERT INTO users (username,userpic) VALUES (?,?)');
$sql->bind_param("ss",$username,$userpic);
$sql->execute();
$sql->close();
$con->close();
}
else{
echo "no files";
}
?>
所以事情应该起作用的方式是当有人上传图像时,图像应该直接插入到&#34; userpic&#34;表,香港专业教育学院读了这样的其他帖子,但他们不一样..我应该如何实现这一点?谢谢你的帮助!! (不是最聪明的PHP,但我正在尝试)
答案 0 :(得分:1)
如果您在上传文件时使用客户端提供的名称存储文件,则可能会覆盖图像(例如,如果两个用户上传了me.png) - 使用用户名来存储图像会好得多,然后你甚至不需要mysql表来将用户连接到他们的照片..
<?php
session_start();
$username = $_SESSION['user'];
if(empty($username)){
echo "Error: no username found";
}
else if(isset($_FILES['file']) ){
//create a path to move file to
$newpath = 'files/'.$username;
if (move_uploaded_file($_FILES['file']['tmp_name'], $newpath)) {
echo "File is valid, and was successfully uploaded.\n";
} else {
echo "Error: Possible file upload attack!\n";
}
}
else{
echo "No Files to save";
}
在此代码中,我们使用会话中的用户名,并检查其不是空白。 然后我们使用它将图像存储在您的文件夹中。
请注意,这忽略了许多安全问题:
在您的用户名中包含../
,这会导致文件保存在files目录之外。
如果您已经验证了用户名,则这可能不是问题,另一种解决方案是创建用户名的哈希值并使用此代码:$newpath = 'files/'.md5($username);
不检查错误,或验证文件确实是图像。
这些图像将如何在此之后使用?
如果files目录在你的htdocs中,那么所有内容都可以使用 - 将它存储在你的htdocs之外可能会更好
例如$newpath = '/var/myappdata/userimages/'.md5($username);
然后你可以创建另一个文件userimage.php来读取文件:
<?php
session_start();
$username = $_SESSION['user'];
$path = '/var/myappdata/userimages/'.md5($username);
readfile($path);
这允许您进行其他检查,例如允许用户查看图像。
这里仍然有很多可以涵盖的内容,希望这足以让你向前发展,但在将其投入生产之前,请详细了解文件上传安全性。
如果您确实想在数据库中存储有关图像的信息,可以执行以下操作:
<?php
session_start();
include ("connect.php");
$username = $_SESSION['user'];
if(empty($username)){
echo "Error: no username found";
}
else if(isset($_FILES['file']) ){
//create a path to move file to
$filename = basename($_FILES['file']['name']);
$newpath = 'files/'.$filename;
if (move_uploaded_file($_FILES['file']['tmp_name'], $newpath)) {
echo "File is valid, and was successfully uploaded.\n";
$sql = $con->prepare('INSERT INTO users (username,userpic) VALUES (?,?)');
$sql->bind_param("ss",$username,$filename);
$sql->execute();
$sql->close();
$con->close();
} else {
echo "Error: Possible file upload attack!\n";
}
}
else{
echo "No Files to save";
}
正如我所说 - 如果两个用户上传相同的文件,你将遇到冲突。
答案 1 :(得分:0)
您不希望将整个URL存储在数据库中。您只需要到服务器上的路径即可。这是您将tmp文件移动到新位置的部分。在你的情况下,它将是以下。
$userpic = 'files/'.$_FILES['file']['name'];