图像上传到mysql

时间:2017-02-18 19:47:07

标签: php mysql

您好我现在能够将文件上传到我网站上的文件夹,但是我无法理解我应该如何从我的文件到我的数据库获取路径... enter image description here

<?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,但我正在尝试)

2 个答案:

答案 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);

不检查错误,或验证文件确实是图像。

  

http://php.net/manual/en/features.file-upload.errors.php

     

PHP image upload security check list

这些图像将如何在此之后使用? 如果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'];