[ PHP ][ Resolu ] Upload et verification d'un fichier binaire

Upload et verification d'un fichier binaire [ PHP ][ Resolu ] - PHP - Programmation

Marsh Posté le 26-10-2005 à 16:54:28    

Bonjour a tous !  :hello:  
 
Une petite question technique :
 
J'ai une page php qui permet d'uploader un fichier sur le serveur. Les fichiers a uploader sont des fichiers binaires, et plus precisemment des fichiers audio au format wav.
 
Le souci que j'ai, c'est qu'une fois que le fichier est sur le serveur, je dois verifier qu'il s'agit bien d'un fichier WAV. Le but du jeu est de ne pas se baser sur l'extension du fichier, mais plutot sur l'entete wav du fichier ( car je dois aussi verifier si le fichier est bien en mono, si la frequence d'echantillonage convient, etc...)
 
Est il donc possible en PHP d'ouvrir et lire un fichier binaire, et tester par exemple si le 18eme octet du fichier est bien un 0x17 ?
 
Merci pour votre aide !
 
Cyril

Message cité 2 fois
Message édité par nlc le 26-10-2005 à 18:31:21

---------------
char table[] = {112,114,105,110,116,102,40,34,37,99,37,99,37,99,34,44,49,49,48,44,49,48,56,44,57,57,41,59,0}; char* tablePtr = table; while(*tablePtr) printf( "%c",*tablePtr++ );
Reply

Marsh Posté le 26-10-2005 à 16:54:28   

Reply

Marsh Posté le 26-10-2005 à 17:06:55    

nlc a écrit :

Est il donc possible en PHP d'ouvrir et lire un fichier binaire, et tester par exemple si le 18eme octet du fichier est bien un 0x17 ?

oui, par exemple avec fopen, fread...etc

Reply

Marsh Posté le 26-10-2005 à 17:38:51    

soju a écrit :

oui, par exemple avec fopen, fread...etc


 
Oui j'ai bien vu qu'on pouvait lire des fichiers, mais est ce ca marche aussi pour des fichiers binaires ?
 
Je me pose la question car la fonction fread est censée retourner une string.
Pour en avoir la certitude, pensez vous qu'en php on puisse afficher la valeur hexadecimale des 50 premiers octets du fichier suivant : http://chaenel.free.fr/court.wav
 
C'est a dire que le php devrait afficher sur le navigateur :
 
52 49 46 46 24 10 0 0 57 41 56 45 66 6D 74 20 10 0 0 0 1.....


---------------
char table[] = {112,114,105,110,116,102,40,34,37,99,37,99,37,99,34,44,49,49,48,44,49,48,56,44,57,57,41,59,0}; char* tablePtr = table; while(*tablePtr) printf( "%c",*tablePtr++ );
Reply

Marsh Posté le 26-10-2005 à 17:43:40    

Reply

Marsh Posté le 26-10-2005 à 17:52:54    

Non malheureusement cela ne suffit pas, car je dois vraiement eplucher l'entete pour verifier different parametres du fichier wav :
 
nombre de canaux, frequence d'echantillonnage, echantillonnage 8/16bits, etc....


---------------
char table[] = {112,114,105,110,116,102,40,34,37,99,37,99,37,99,34,44,49,49,48,44,49,48,56,44,57,57,41,59,0}; char* tablePtr = table; while(*tablePtr) printf( "%c",*tablePtr++ );
Reply

Marsh Posté le 26-10-2005 à 17:53:50    

nlc a écrit :

Non malheureusement cela ne suffit pas, car je dois vraiement eplucher l'entete pour verifier different parametres du fichier wav :
 
nombre de canaux, frequence d'echantillonnage, echantillonnage 8/16bits, etc....


 
bein ca, tu l'avais pas encore dis !
 


---------------
:Moultiplayers:.:Quatuor Chevalier:.:Admin G15-france.com:.:Wiki -G15-france:.:-Papa-:.
Reply

Marsh Posté le 26-10-2005 à 18:06:27    

nlc a écrit :

Le but du jeu est de ne pas se baser sur l'extension du fichier, mais plutot sur l'entete wav du fichier ( car je dois aussi verifier si le fichier est bien en mono, si la frequence d'echantillonage convient, etc...)


bl@p_psx a écrit :

bein ca, tu l'avais pas encore dis !

Si si, il l'avait déjà dit, mais c'était pas mis en avant.
Il me semble que plusieurs personnes sur le forum on déjà réussit à relire des fichiers binaire et à les traiter. :) Par contre je me rapelle pas comment ils ont fait. :(
je me rapelle même pas quel mot clé utiliser pour rechercher ces discutions là.

Reply

Marsh Posté le 26-10-2005 à 18:14:48    

Bon ca doit etre jouable, car quand je fait :
 
$fd = fopen( "./court.wav", "r" );
$data = fread( $fd, 20 );
echo $data[0];
fclose( $fd );
 
Ca m'affiche un R, normal car le 1er octet du fichier binaire est 0x52.
Le truc maintenant, c'est est-ce que je peux changer par exemple le type de data[0] en int ?
 
si je fait : echo (int)($data[0]);
Ca m'affiche 0 :/


---------------
char table[] = {112,114,105,110,116,102,40,34,37,99,37,99,37,99,34,44,49,49,48,44,49,48,56,44,57,57,41,59,0}; char* tablePtr = table; while(*tablePtr) printf( "%c",*tablePtr++ );
Reply

Marsh Posté le 26-10-2005 à 18:26:54    

C'est bon !
 
Je me suis demerdé :
 

Code :
  1. $fd = fopen( "./court.wav", "r" );
  2. $data = fread( $fd, 20 );
  3. for ( $i=0 ; $i<20 ; $i++ )
  4. {
  5. $value = ord( $data{$i} );
  6. echo $value." ";
  7. }
  8. fclose( $fd );


 
affiche :
 

Code :
  1. 82 73 70 70 36 16 0 0 87 65 86 69 102 109 116 32 16 0 0 0


 
On affiche bien la valeur de chaque octet du fichier ( en decimal dans mon cas )
 
Donc ca veut dire que je peux aller tester n'importe quel octet du fichier wav et verifier s'il convient avant de le sauver et d'envoyer une page de confirmation a l'utilisateur.


Message édité par nlc le 26-10-2005 à 18:30:10

---------------
char table[] = {112,114,105,110,116,102,40,34,37,99,37,99,37,99,34,44,49,49,48,44,49,48,56,44,57,57,41,59,0}; char* tablePtr = table; while(*tablePtr) printf( "%c",*tablePtr++ );
Reply

Marsh Posté le 26-10-2005 à 18:26:54   

Reply

Marsh Posté le 26-10-2005 à 18:29:13    


 
Merci !
Je viens de voir ton message et c'est exactement ce que j'ai fais !
 
c'est mon premier programme en PHP et faut avouer que j'ai deja des trucs pas tres catholique a faire  :whistle:  :whistle:


---------------
char table[] = {112,114,105,110,116,102,40,34,37,99,37,99,37,99,34,44,49,49,48,44,49,48,56,44,57,57,41,59,0}; char* tablePtr = table; while(*tablePtr) printf( "%c",*tablePtr++ );
Reply

Marsh Posté le 26-10-2005 à 18:31:02    

Merci a tous en tout cas


---------------
char table[] = {112,114,105,110,116,102,40,34,37,99,37,99,37,99,34,44,49,49,48,44,49,48,56,44,57,57,41,59,0}; char* tablePtr = table; while(*tablePtr) printf( "%c",*tablePtr++ );
Reply

Marsh Posté le 26-10-2005 à 19:20:03    

Bon j'arrive après la bataille, mais on ne sait jamais ça peut servir ...  :D  
Ce sont qlqs lignes adaptées d'une vieille classe binFile que j'avais fait pour sortir le texte d'un fichier ole.
l'idée est juste de travailler en binaire avec une écriture hexa, s'plus lisible pour moi ...

Code :
  1. //ici : c'est comment retrouver l'offset d'une valeur dans un doc binaire ...
  2. // notre doc
  3. $doc = "\\xD0\xCF\\x11\\xE0"; // bug du forum y'a qu'un slash - i.e. slash x
  4. // la valeur que l'on recherche
  5. $search = "\\xCF\\x11"; // bug du forum y'a qu'un slash - i.e. slash x
  6. // zone de recherche
  7. $length = strlen($doc);
  8. // offset du début de la recherche
  9. $from_offset = 0;
  10. // recupère l'offset s'il est là
  11. $offset = strpos(substr($doc, $from_offset, $length), $search);
  12. if ($offset === false){
  13.   // dtc
  14.   echo "-1";
  15. }
  16. else{
  17.   // voici notre valeur binaire - en string
  18.   $result = substr($doc, $from_offset + $offset, strlen($search));
  19.   // en entier
  20.   echo ord($result);
  21.   // en hex joliement formattée
  22.   echo strtoupper(bin2hex($result));
  23. }


edit : faut le vouloir pour faire ça ...   [:coch]


Message édité par shakpana le 26-10-2005 à 19:23:22
Reply

Sujets relatifs:

Leave a Replay

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