2010-11-30 5 views
1

Après avoir reçu le post, comment redimensionner à une plus petite largeur (la largeur maximale est 80, min aussi 80) et que dois-je vérifier pour des raisons de sécurité?PHP redimensionner l'image avant de sauvegarder dans la base de données mysql?

Mon code actuel:

if(!empty($_FILES)) { 
# Resize Image function 
$return=true; 
function resizeImage($originalImage,$toWidth,$toHeight){ 
    // Get the original geometry and calculate scales 
    list($width, $height) = getimagesize($originalImage); 
    $xscale=$width/$toWidth; 
    $yscale=$height/$toHeight; 

    // Recalculate new size with default ratio 
    if ($yscale>$xscale){ 
     $new_width = round($width * (1/$yscale)); 
     $new_height = round($height * (1/$yscale)); 
    } 
    else { 
     $new_width = round($width * (1/$xscale)); 
     $new_height = round($height * (1/$xscale)); 
    } 

    // Resize the original image 
    $imageResized = imagecreatetruecolor($new_width, $new_height); 
    $imageTmp  = imagecreatefromjpeg ($originalImage); 
    imagecopyresampled($imageResized, $imageTmp, 0, 0, 0, 0, $new_width, $new_height, $width, $height); 

    return $imageResized; 
} 

// Get the file information 
$userfile_name = $_FILES['profile_picture']['name']; 
$userfile_tmp = $_FILES['profile_picture']['tmp_name']; 
$userfile_size = $_FILES['profile_picture']['size']; 
$userfile_type = $_FILES['profile_picture']['type']; 
$filename = basename($_FILES['profile_picture']['name']); 
$file_ext = strtolower(substr($filename, strrpos($filename, '.') + 1)); 

//Only process if the file is a JPG and below the allowed limit 
if((!empty($_FILES["profile_picture"])) && ($_FILES['profile_picture']['error'] == 0)) { 
    $allowed_image_types = array('image/pjpeg'=>"jpg",'image/jpeg'=>"jpg",'image/jpg'=>"jpg",'image/png'=>"png",'image/x-png'=>"png",'image/gif'=>"gif"); 
    $allowed_image_ext = array_unique($allowed_image_types); // Do not change this 
    foreach ($allowed_image_types as $mime_type => $ext) { 
     if($file_ext==$ext){ 
      $return=false; 
      break; 
     } else { 
      $return=true; 
     } 
    } 

    if ($userfile_size > (7*1048576)) { # 7 means 7 mb 
     $return=false; 
    } 
} else { 
    $return=false; 
} 

//Everything is ok, so we can upload the image. 
if (strlen($return)==0){ 
    $widthAndHeight = getimagesize($userfile_tmp . "." . $file_ext); //EDITED QUESTION 
    $width = $widthAndHeight[0]; 
    $height = $widthAndHeight[1]; 

    if ($width > 80){ 
     $scale = 80/$width; 
     $height = $height * $scale; 
     $data = resizeImage($userfile_name,80,$height,$scale); 
     $data = mysql_real_escape_string($data); 
    } else { 
     $data = mysql_real_escape_string($userfile_name); 
    } 

    $update = mysql_query("UPDATE `avatar` set image = '{$data}' WHERE userid = '" . $_SESSION['userid'] . " . '"); 
} else { 
    $return=false; 
} 

Le type de données dans la base de données MySQL est MEDIUMBLOB car il stocke seulement petit fichier

Désolé pour ne pas mentionner mon problème, le code de son ne fonctionne pas. L'erreur est:

Warning: getimagesize(C:\wamp\tmp\php991B.tmp.png) [function.getimagesize]: failed to open stream: No such file or directory in C:\wamp\www\XXX\avatar.php on line 82**strong text** 
+0

votre problème n'a rien à voir avec la base de données. il est dit "fichier introuvable". Vérifiez le chemin du fichier. –

+0

Avoir des fichiers stockés dans la base de données, vous devez démarrer un processus PHP séparé pour servir chaque image sur la page et faire une autre connexion à la base de données. C'est un surcoût inacceptable pour le développement web. Toutes les données statiques telles que les images doivent être traitées telles quelles, et non via une page dynamique. –

Répondre

4

Meilleure façon sera - pour stocker l'image dans le système de fichiers et de stocker une référence au fichier dans la base de données. (Pour le redimensionnement, vous pouvez utiliser la bibliothèque GD)

Essayez ce lien: http://www.php.net/manual/en/function.imagecopyresized.php

+0

J'ai fait des recherches sur le stockage d'image sur le système de fichiers et la base de données, chacun a ses propres avantages et inconvénients. Bien que la majorité préfère le système de fichiers. –

+0

mais une image RGB 80x80 est seulement 18.75KB –

+0

D'accord avec Don, c'est pourquoi je le stocke dans Blob –

0

Si vous ne avez pas vraiment besoin d'écrire votre propre code pour cela, vous pouvez essayer quelques-unes des solutions qui sont déjà en Là.

C'est un excellent scénario http://phpthumb.gxdlabs.com/

Je ne sais pas si vous pouvez enregistrer les données d'image à une base de données en utilisant, mais le pire des scénarios est

vous redimensionnez l'image et l'enregistrer local dossier utilisez file_get_contents pour lire l'image et enregistrer au format db supprimer l'image temporaire sur le serveur.

Mais je suis d'accord avec ceux qui disent que vous devriez stocker les images dans le système de fichiers, pas dans la base de données.

Questions connexes