2011-08-01 4 views
0

J'essaie de permettre aux utilisateurs de télécharger des fichiers sur mon site Web, mais malheureusement, certains d'entre eux semblent se corrompre en les lisant. J'ai essayé les deux images et les fichiers html, et toutes les images sont corrompues (les fichiers HTML passent bien).Téléchargement de fichier corrompu PHP

Pour télécharger les fichiers, j'utilise un formulaire HTML standard et le tableau PHP $ _FILES. J'utilise ensuite le code suivant pour lire le contenu du fichier:

$ filename = $ _FILES ['varname'] ['tmp_name'];

$ handle = fopen ($ filename, "r"); `

$ contenu = fread ($ handle, taille du fichier ($ filename));

fclose ($ handle);

Malheureusement, la valeur du contenu $ est maintenant un peu différent du fichier que j'ai téléchargé (voici un extrait du haut du fichier):

fichier d'origine:

ÿ · ExifII * ÏDucky < ÓAdobed¿ € Ñ

Nouveau fichier:

· Exif II ÿ * Ï Ducky < Ó Adobe d¿ € Ñ

Comme vous pouvez le voir, il y a une différence dans l'espacement. Des idées sur ce que cela causerait? Est-ce que je manipule le fichier lu incorrectement pour les fichiers binaires? Il semble étrange que c'est bien pour tous les fichiers texte que je télécharge ..

Merci!

Répondre

0

Comment imprimez-vous le contenu de $? Êtes-vous sûr que c'est un problème avec la lecture du fichier?

Je suppose que c'est peut-être un problème avec l'impression du fichier à la sortie ... Essayez d'imprimer de manière binaire. Quelque chose comme:

$data = unpack("C*", $contents);  
foreach ($data as $v) 
{ 
    echo $v, ' '; 
} 

et comparer avec vidage binaire du fichier d'origine ...

+0

Cela a produit une charge de nombres donc je vais faire une comparaison de cela sous peu. Malheureusement, je ne publie pas le fichier. La variable $ contents est envoyée dans un système tiers (ce qui est bien avec les fichiers provenant d'autres systèmes), il est donc difficile de déboguer là où tout va mal! – RichW

2

I généralement des fichiers de sortie comme ceci:

header("Content-Disposition: attachment; filename=\"$fileName\"");  
readfile("$HOME_DIR/uploads/$fileName"); 
exit(); 

Quoi qu'il en soit, pour essayer de déboguer votre problème, Vous devez d'abord comprendre quelle phase échoue. Télécharger ou télécharger? Pour vérifier, il suffit d'aller sur votre serveur web et de télécharger le fichier via FTP, puis de l'ouvrir dans un éditeur binaire. Si c'est déjà corrompu alors vous devez examiner votre phase de téléchargement, sinon c'est l'inverse.