2017-07-25 6 views
0

Jedes Mal, wenn ein Benutzer ein Bild für ihr "Profilbild" einreicht, wird es als "gebrochenes Bild" angezeigt und ich habe festgestellt, dass wenn ich ein Bild physisch in die MySQL-Datenbank einfügen und anzeigen , es funktioniert einwandfrei und die Größe der Datei ändert sich zu "BLOB - KiB" anstelle von MB. Aber wenn ich dasselbe Bild mit meiner "Upload-Datei" in die Datenbank einfüge, wird dieses Bild zu "BLOB MB" und auf der Website nicht angezeigt. Ich habe einen Post darüber gesehen und sie haben gesagt, dass sie die "addslashes" von der Variable entfernen sollen und ich habe das gemacht, aber es hat immer noch nicht funktioniert. Also, was ich tun möchte, ist das Bild von der Datenbank anzuzeigen, die vom Benutzer eingereicht wurde. Es funktioniert, wenn Sie es physisch in die Datenbank ohne eine Datei einfügen, aber wenn Sie es mit einer tun, funktioniert es nicht. Hier ist ein Screenshot der Datenbankstruktur, Upload-Datei und Abrufen der Datei.PHP - gebrochenes Bild aus der Datenbank

enter image description here

PHP Upload

session_start(); 
if(empty($_FILES) && empty($_POST) && isset($_SERVER['REQUEST_METHOD']) && strtolower($_SERVER['REQUEST_METHOD']) == 'post') { //catch file overload error... 
    $postMax = ini_get('post_max_size'); //grab the size limits... 
    echo "<p style=\"color: #F00;\">\nPlease note files larger than {$postMax} will result in this error!</p>"; // echo out error and solutions... 
    return $postMax; 
} 
if(isset($_COOKIE['username'])) { 
    if($_SESSION['came_from_upload'] != true) { 
     setcookie("username", "", time() - 60 * 60); 
     $_COOKIE['username'] = ""; 
     header("Location: developerLogin.php"); 
     exit; 
    } 
    error_reporting(E_ALL & ~E_NOTICE); 
    if($_SERVER['REQUEST_METHOD'] == "POST") { 
     $token = $_SESSION['token']; 
     $userid = $_SESSION['id']; 
     $fullname = addslashes(trim($_POST['fullname'])); 
     $username = addslashes(trim($_POST['username'])); 
     $email = addslashes(trim($_POST['email'])); 
     $password = addslashes(trim($_POST['password'])); 
     $storePassword = password_hash($password, PASSWORD_BCRYPT, array(
      'cost' => 10 
     )); 
     $file_tmp = addslashes(trim($_FILES['file']['tmp_name'])); 
     $file_name = addslashes(trim($_FILES['file']['name'])); 
     try { 
      // new php data object 
      $handler = new PDO('mysql:host=127.0.0.1;dbname=magicsever', 'root', ''); 
      //ATTR_ERRMODE set to exception 
      $handler->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
     } 
     catch(PDOException $e) { 
      die("There was an error connecting to the database"); 
     } 
     $stmtChecker = $handler->prepare("SELECT * FROM generalusersdata WHERE user_id = ?"); 
     $stmtChecker->execute(array(
      $userid 
     )); 
     if($result = !$stmtChecker->fetch()) { 
      setcookie("username", "", time() - 60 * 60); 
      $_COOKIE['username'] = ""; 
      header("Location: developerLogin.php"); 
      exit; 
     } 
     if(!empty($fullname)) { 
      $stmtFullname = $handler->prepare("UPDATE generalusersdata SET fullname = ? WHERE user_id = ?"); 
      $stmtFullname->execute(array(
       $fullname, 
       $userid 
      )); 
     } 
     if(!empty($username)) { 
      $stmtCheckerUsername = $handler->prepare("SELECT * FROM generalusersdata WHERE username = ?"); 
      $stmtCheckerUsername->execute($username); 
      if($resultCheckerUsername = $stmtCheckerUsername->fetch()) { 
       die("Username Already in use! Please try again"); 
      } 
      $stmtUsername = $handler->prepare("UPDATE generalusersdata SET username = ? WHERE user_id = ?"); 
      $stmtUsername->execute(array(
       $username, 
       $userid 
      )); 
     } 
     if(!empty($email)) { 
      if(filter_var($email, FILTER_VALIDATE_EMAIL) == false) { 
       die("Email is Not Valid!"); 
      } 
      $stmtCheckerEmail = $handler->prepare("SELECT * FROM generalusersdata WHERE email = ?"); 
      $stmtCheckerEmail->execute($email); 
      if($resultCheckerEmail = $stmtCheckerEmail->fetch()) { 
       die("Email Already in use! Please try again"); 
      } 
      $stmtEmail = $handler->prepare("UPDATE generalusersdata SET email = ? WHERE user_id = ?"); 
      $stmtEmail->execute(array(
       $email, 
       $userid 
      )); 
     } 
     if(!empty($password)) { 
      if(strlen($password) < 6) { 
       die("Password has to be GREATER than 6 characters!"); 
      } 
      //Check if password has atleast ONE Uppercase, One Lowercase and a number 
      if(!preg_match("(^(?=.*[a-z])(?=.*[A-Z])(?=.*\d).+$)", $password)) { 
       echo 'Password needs to be at least ONE uppercase, ONE lowercase, and a number!'; 
       exit; 
      } 
      $stmtPassword = $handler->prepare("UPDATE generalusersdata SET password = ? WHERE user_id = ?"); 
      $stmtPassword->execute(array(
       $storePassword, 
       $userid 
      )); 
     } 
     if($_FILES['file']['error'] == UPLOAD_ERR_OK) { 
      $mime = mime_content_type($_FILES['file']['tmp_name']); 
      if(strstr($mime, "video/")) { 
       die("Please note that this file is NOT an image... Please select an image for your Profile Picture"); 
      } else if(strstr($mime, "image/")) { 
       $allowedTypes = array(
        IMAGETYPE_PNG, 
        IMAGETYPE_JPEG 
       ); 
       $detectedType = exif_imagetype($_FILES['file']['tmp_name']); 
       if($extensionCheck = !in_array($detectedType, $allowedTypes)) { 
        die("Failed to upload image; the format is not supported"); 
       } 
       $dir = "devFiles/"; 
       $uploadedFile = $dir . basename($_FILES['file']['name']); 
       if(is_dir($dir) == false) { 
        mkdir($dir, 0700); 
       } 
       if(!move_uploaded_file($_FILES['file']['tmp_name'], $uploadedFile)) { 
        die("There was an error moving the file... Please try again later!"); 
       } 
       $stmtFile = $handler->prepare("UPDATE generalusersdata SET profile_image = ?, file_tmp = ? WHERE user_id = ?"); 
       $stmtFile->execute(array(
        $file_name, 
        $file_tmp, 
        $userid 
       )); 
      } 
     } 
     $_SESSION['token'] = $token; 
     header("Location: developerUpload.php"); 
     exit; 
    } 
} else { 
    header("Location: developerLogin.php"); 
    exit; 
} 

HTML

<form method="post" enctype="multipart/form-data" autocomplete="off"> 
    Information Changer<br> 
    Fullname: <input type="text" name="fullname" placeholder="Full Name....."> 
    <br/> 
    <br/> 
    Username: <input type="text" name="username" placeholder="User Name....."> 
    <br/> 
    <br/> 
    Email: <input type="text" name="email" placeholder="Email....."> 
    <br/> 
    <br/> 
    Password: <label><input type="password" name="password" placeholder="Password....." ></label> 
    <br></br> 
    Profile Picture: <input type="file" name="file"> 
    <br/> 
    <input type="submit" name="submit"> 
</form> 

Abrufen von Datei

try { 
    // new php data object 
    $handler = new PDO('mysql:host=127.0.0.1;dbname=magicsever', 'root', ''); 
    //ATTR_ERRMODE set to exception 
    $handler->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
} 
catch(PDOException $e) { 
    die("There was an error connecting to the database"); 
} 
$stmt = $handler->prepare("SELECT * FROM generalusersdata WHERE user_id = :userid"); 
$stmt->bindValue(':userid', '61', PDO::PARAM_INT); 
$stmt->execute(); 
while($result = $stmt->fetch()) { 
    echo '<img src="data:image/jpeg;base64,' . base64_encode($result['file_tmp']) . '"/>'; 
} 
+0

Sie verwenden vorbereitete Anweisungen mit Platzhalter-Werte, die die richtige Art und Weise ist, es zu tun, aber Sie sind auch das Hinzufügen 'addslashes' oben auf das, was mangle wird Ihre Daten und Dinge zu brechen. Diese Methode sollte nicht in diesem Code verwendet werden, es verursacht nur Chaos. – tadman

Antwort

3

Sie Datei Speichern des temporay Dateiname - nicht sein Inhalt.

$file_tmp = addslashes(trim($_FILES['file']['tmp_name'])); 

Sollte

$file_tmp = file_get_contents($_FILES['file']['tmp_name']); 
+0

Ohhh wow ich dachte, das war die Art, wie du den Inhalt speicherst. Danke und wenn ich eine andere schnelle Frage stellen kann, wenn ich "getPath()" für den "directoryIterator" benutze und es echo, gibt es mir den tatsächlichen Pfad eines Bildes im Verzeichnis. Aber ich möchte das Bild nicht den Pfad nehmen und an die Datenbank senden. Ist das möglich? – Jagr

+0

Ja, der selbe Trick 'file_get_contents ($ the_path)' –

+0

Ach so, ich habe nur den Pfad und setze ihn gleich einer Variablen wie "$ test = file_get_contents ($ path)"? Und dann in die Datenbank schicken? – Jagr

Verwandte Themen