Transfert d'images en base de données

cs_lancelolo Messages postés 21 Date d'inscription mardi 16 novembre 2004 Statut Membre Dernière intervention 16 octobre 2009 - 16 oct. 2009 à 18:18
neigedhiver Messages postés 2480 Date d'inscription jeudi 30 novembre 2006 Statut Membre Dernière intervention 14 janvier 2011 - 16 oct. 2009 à 20:53
Bonjour,

J'ai des pages php qui me permettent de transférer des photos dans une base de données avec le type "blob". Le problème c'est que certaines photos ne se chargent pas entierment. Il y a toujours une bande blanche dans le bas de la photo. Un problème dans le chargement ou dans le poids ? Pourtant mes photos font moins de 100 Ko. Voilà mes pages :

une page photo.php qui reçoit en parametre l'id du véhicule à qui attribuer la photo (la pas de pb)

<HEAD>
</HEAD>

<?php
include ("transfert.php");
if ( isset($_FILES['fic']) )
{
if (transfert($_GET["voit"]))
{
echo "Transfert réussi";
echo "
Retour
";
}
}
?>
<form enctype="multipart/form-data" action="#" method="post">



</form>


--------------------------------------------------------------

La pae transfert.php

<?php
function transfert ($car)
{
$ret = false;
$img_blob = '';
$img_taille = 0;
$img_type = '';
$img_nom = '';
$taille_max = 9000000;
$ret = is_uploaded_file ($_FILES['fic']['tmp_name']);
if ( !$ret )
{
echo "Problème de transfert";
return false;
}
else
{
// Le fichier a bien été reçu
$img_taille = $_FILES['fic']['size'];
if ( $img_taille > $taille_max )
{
echo "Trop gros !";
return false;
}
$img_type = $_FILES['fic']['type'];
$img_nom = $_FILES['fic']['name'];

include('libs/prefs.php');
$sql "SELECT * FROM images WHERE img_nom "".$img_nom.""";
$query = mysql_query($sql);
$total = mysql_num_rows($query);


if($total)
{
}
else
{

$img_blob = file_get_contents ($_FILES['fic']['tmp_name']);

$req = "INSERT INTO images (".
"img_nom, img_taille, img_type, img_blob ".
") VALUES (".
"'".$img_nom."', ".
"'".$img_taille."', ".
"'".$img_type."', ".
// N'oublions pas d'échapper le contenu binaire
"'".addslashes ($img_blob)."') ";

mysql_query ($req);

$sql0 "SELECT img_id FROM images WHERE img_nom "".$img_nom.""";
$query0 = mysql_query($sql0);
$result0 = mysql_fetch_array($query0);

$idimg = $result0["img_id"];

$ins = "INSERT INTO photos (idvoit, img_id) VALUES (".$car.",".$idimg.")";
mysql_query ($ins);

unset($_FILES);
return true;
}
}
}
?>


--------------------------------------------------------------

Et en transferant des photos de moins de 100 Ko j'ai une bande blanche en bas de la photo, sauf pour celle de 60Ko, pas de bande.
Visible ici par ex : http://www.spvautomobiles.com/detail.php?voit=39

Merci d'avance pour votre aide parce que la je tourne en rond.

1 réponse

neigedhiver Messages postés 2480 Date d'inscription jeudi 30 novembre 2006 Statut Membre Dernière intervention 14 janvier 2011 19
16 oct. 2009 à 20:53
Salut,

Je pense que la réponse ne se trouve pas dans ton script, mais du côté de ta table MySQL, plus précisément, le type de champ utilisé pour stocker tes photos...
Jette un oeil ici : Capacités des colonnes

BLOB => 2^16 + 1 octet. Soit 65536+1 = 65537 octets.
Or 65537 octet, c'est, en puissance de 2, exactement 64Kio (65,5Ko)

Conclusion, dans un champ de type BLOB, on ne PEUT PAS stocker plus de 64Ko de données. Si tes photos peuvent aller jusqu'à 100Ko, il faut alors changer le type de ta colonne pour MEDIUMBLOB :

ALTER TABLE `images` MODIFY `img_blob` MEDIUMBLOB NULL;


Je profite de l'occasion pour attirer ton attention sur la protection que tu fais sur img_blob : c'est infiniment insuffisant. Utilise de préférence mysql_real_escape_string() qui protègera le contenu des caractères binaires qui pourraient causer ta perte ;)

--
Neige

N'hésitez pas à lire la doc
0