Upload de fichiers en PHP : corruption des données

Upload de fichiers en PHP : corruption des données - PHP - Programmation

Marsh Posté le 04-05-2011 à 11:46:38    

Bonjour,
 
J'avais un process d'upload et de lecture de fichiers en PHP dans une table MySQL et un champ de type longblob.
Auparavant, j'étais sur un environnement datant de 5 ans, en PHP 4.
Nous sommes passés récemment sur php 5.3.2 et mysql 5.1.41.
 
Depuis, certains types de fichiers présentent des anomalies avec le traitement d'extraction pour les télécharger sur une page, mais je ne sais pas l'origine du problème.
 
Par ex, tous les documents Office 2003 sont corrompus ("Impossible de démarrer le convertisseur mswrd632.wpc" )
Pour les docs Office 2007 (en Open XML donc), il y a un message d'erreur à l'ouverture mais est ensuite proposé de réupérer le contenu illisible et le document s'affiche correctement ensuite.
Pour les pdf, aucun soucis.
 
Je ne sais pas si cela est du au code PHP qui ne serait plus à jour, ou à un problème de codage par rapport à MySQL ?
Vous avez des pistes ?
 
Pour info, voici le code de la fonction qui traite le contenu du fichier inséré au moment de la requête INSERT.
Il y a t-il mieux à faire ?
Merci à vous, je suis vraiment bloqué...si vous avez des pistes pour tester en profondeur l'origine de la corruption..
 

Code :
  1. function getFileData($field_name) {
  2.  global $vg_path_pdf_cp;
  3.  //printf ("vg_path_pdf_cp: %s\n", $vg_path_pdf_cp);
  4.  if($_FILES[$field_name]["name"] != "" ) {
  5.   $tmpName  = $_FILES[$field_name]['tmp_name'];
  6.    $escaped_tmpName = mysql_real_escape_string($tmpName);
  7.   $fp = fopen($escaped_tmpName, 'r');
  8.   $retour = addslashes(fread($fp, filesize($escaped_tmpName)));
  9.   fclose($fp);
  10.  }
  11.  return $retour;


 
et le code de l'appel au fichier sur la page de téléchargement
 

Code :
  1. if (isset($_GET['id']))
  2.    {
  3.     include ("connexion.php" );
  4.     $id = intval($_GET['id']);
  5.     $req = "SELECT ID_FILE, FICHIER_MIME, FICHIER_NAME, FICHIER_DATA FROM partage_CONTENUS WHERE ID_FILE = ".$id;
  6.     $ret = mysql_query ($req)  or die (mysql_error () );
  7.     $col = mysql_fetch_row ($ret);
  8.     if (!$col[0] )
  9.     {
  10.      echo "Fichier introuvable";
  11.     }
  12.     else
  13.     {
  14.      header ("Content-type: ".$col[1]);
  15.      header('Content-Disposition: attachment; filename='.$col[2]);
  16.      //header ("Content-filename: ".$col[2]);
  17.      echo $col[3];
  18.     }
  19.    }


Message édité par AirSonic le 04-05-2011 à 11:53:05
Reply

Marsh Posté le 04-05-2011 à 11:46:38   

Reply

Marsh Posté le 04-05-2011 à 12:10:24    

le champ dans lequel tu stockes ça fait quelle taille ?
 
en général on stocke les fichiers a coté et on ne met en base que le chemin d'accès


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

Reply

Marsh Posté le 04-05-2011 à 12:15:53    

Ce n'est pas un problème de taille : les fichiers font moins de 5 Mo au max, et le champ est de type longblob.
 
Et surtout, tout le process fonctionnait nickel avant la migration vers des versions plus récentes de PHP et MySQL.
 
Merci.

Reply

Marsh Posté le 04-05-2011 à 12:19:33    

tu n'as pas un espace qui se rajouterait au début ou à la fin de tes fichiers ?
ou un message d'erreur

 

est ce que tu as essayer de comparer le fichier source et le fichier récupéré avec un éditeur de texte ?


Message édité par flo850 le 04-05-2011 à 12:20:16

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

Reply

Marsh Posté le 04-05-2011 à 12:24:15    

Pas d'espace sinon l'accès au fichier ne serait même pas possible.
Là, le fichier est trouvé et lu, mais semble plus ou moins corrompu au download suivant leur types.
 
Pas essayé la comparaison. tu conseilles un éditeur hexa en particulier pour e rôle ?

Reply

Marsh Posté le 04-05-2011 à 12:28:24    

je ne suis pas aussi catégorique que toi sur les espaces , certains formats pardonnent plus que d'autres
pour tester : un fichier un peu petit et notepad++ (en texte) ou ultraedit (en hexa)


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

Reply

Marsh Posté le 04-05-2011 à 12:36:34    

J'ai vérifié le champ FILE_NAME et il apparait correct, sans espace ni avant ni après.

Reply

Marsh Posté le 04-05-2011 à 14:26:30    

c'est fichier_data qui peut poser problèmes


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

Reply

Marsh Posté le 04-05-2011 à 16:11:04    

A quel moment dans le code tu pourrais penser qu'un espace pourrait se glisser pour le data ?

Reply

Marsh Posté le 04-05-2011 à 22:21:16    

Compare les fichiers avant et apres upload, des erreurs se situent surement avec les caractères ' /  "


Message édité par GordonF_69 le 04-05-2011 à 22:21:58
Reply

Marsh Posté le 04-05-2011 à 22:21:16   

Reply

Marsh Posté le 05-05-2011 à 12:47:46    

Mais plus globalement, c'est quand même surprenant que tout fonctionnait nickel et que depuis l'upgrade du serveur, les fichiers soient corrompus, non ?

Reply

Marsh Posté le 05-05-2011 à 13:14:57    

Le php.ini peut etre différent
Puis entre php 4 et 5.3+ ya de GROSSES différences...
C'est la ou un dev qui connait bien php devient important ...


Message édité par GordonF_69 le 05-05-2011 à 13:15:24
Reply

Marsh Posté le 05-05-2011 à 14:23:59    

J'ai essayé une méthode alternative en stockant le fichier sur le serveur et en ne mettant que le lien.
Le fichier est bien valide sur le serveur, mais j'ai l'impression que c'est au moment de la lecture du fichier que la corruption se fait !
Pourtant le code est tout ce qu'il y a de standard, j'ai l'impression...
 
 

Code :
  1. $id = intval($_GET['id']);
  2.     $req = "SELECT ID_FILE, FICHIER_MIME, FICHIER_NAME, path, size FROM partage_CONTENUS WHERE ID_FILE = ".$id;
  3.     $ret = mysql_query ($req)  or die (mysql_error () );
  4.        $col = mysql_fetch_row ($ret);
  5. if (!$col[0] )
  6.     {
  7.      echo "Fichier introuvable";
  8.     }
  9.     else
  10.     {
  11.      header ("Content-type: ".$col[1]);
  12.      header("Content-Disposition: attachment; filename=".$col[2]);
  13.      header("Content-length: ".$col[4]);
  14.      // echo $col[3];
  15.      readfile($col[3]);
  16.     }


Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed