Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2776 connectés 

  FORUM HardWare.fr
  Programmation
  PHP

  Upload de fichiers en PHP : corruption des données

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Upload de fichiers en PHP : corruption des données

n°2073733
AirSonic
Ball don't lie
Posté le 04-05-2011 à 11:46:38  profilanswer
 

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
mood
Publicité
Posté le 04-05-2011 à 11:46:38  profilanswer
 

n°2073743
flo850
moi je
Posté le 04-05-2011 à 12:10:24  profilanswer
 

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


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

n°2073745
AirSonic
Ball don't lie
Posté le 04-05-2011 à 12:15:53  profilanswer
 

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.

n°2073746
flo850
moi je
Posté le 04-05-2011 à 12:19:33  profilanswer
 

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

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

n°2073748
AirSonic
Ball don't lie
Posté le 04-05-2011 à 12:24:15  profilanswer
 

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 ?

n°2073749
flo850
moi je
Posté le 04-05-2011 à 12:28:24  profilanswer
 

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)


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

n°2073750
AirSonic
Ball don't lie
Posté le 04-05-2011 à 12:36:34  profilanswer
 

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

n°2073777
flo850
moi je
Posté le 04-05-2011 à 14:26:30  profilanswer
 

c'est fichier_data qui peut poser problèmes


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

n°2073831
AirSonic
Ball don't lie
Posté le 04-05-2011 à 16:11:04  profilanswer
 

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

n°2073920
GordonF_69
Posté le 04-05-2011 à 22:21:16  profilanswer
 

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
mood
Publicité
Posté le 04-05-2011 à 22:21:16  profilanswer
 

n°2074040
AirSonic
Ball don't lie
Posté le 05-05-2011 à 12:47:46  profilanswer
 

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 ?

n°2074044
GordonF_69
Posté le 05-05-2011 à 13:14:57  profilanswer
 

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
n°2074068
AirSonic
Ball don't lie
Posté le 05-05-2011 à 14:23:59  profilanswer
 

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.     }



Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  PHP

  Upload de fichiers en PHP : corruption des données

 

Sujets relatifs
Validation formulaire d'upload de fichier sans changer de pageProblème de récupération de données
[Php/Sql] Problème Order By(résolu) Protection de données d'un repertoire, probleme de loading
[PHP] Utiliser 2 requêtes SQL dans 1 boucle ? Upload un fichiers par FTP
enlever espaces des noms de fichiersPetite requete selon plage de données
Fonction Recherche sur une plage de données 
Plus de sujets relatifs à : Upload de fichiers en PHP : corruption des données


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR