Précédent   Forum des professionnels en informatique > PHP > Langage > Fichiers
Fichiers Forum d'entraide sur les fichiers avec PHP. Avant de poster -> FAQ fichiers et Sources fichiers
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 27/08/2011, 21h47   #1
Invité régulier
 
Inscription : juin 2006
Messages : 47
Détails du profil
Informations forums :
Inscription : juin 2006
Messages : 47
Points : 7
Points : 7
Par défaut Lecture réécriture d'un fichier volumineux jpg

Bonjour,

J'ai fait le test le lecture et écriture d'un fichier d'image.jpg suivant :

Code :
1
2
3
4
5
6
7
8
$fichieruploaded="../upload/Photo 014.jpg"; // fait 1.5 Mo
$fichiertempo="tempo"; //je renomme ensuite en tempo.jpg pour visualiser
 
$donnne=implode('',file($fichieruploaded));
 
$handle = fopen($fichiertempo, 'w');
fwrite($handle,$donnne);
fclose($handle);
Quand je réécris le fichier, l'image n'est plus lisible ?
Comment dois je faire le traitement (je travaille avec PHP 4.2.0)

En fait mon but est de réécrire le fichier en remplaçant certaines expressions indésirables dans le fichier par une autre expression



=========
il en est de même avec le test suivant (lecture du fichier et traitement ligne par ligne)

Code :
1
2
3
4
5
6
7
8
9
$handle = fopen($fichieruploaded, 'r');
if ($handle){	
while (!feof($handle))	{	
$buffer = fgets($handle);
$handle2 = fopen($fichiertempo, 'a');
fputs($handle2,$buffer);
fclose($handle2);
}
fclose($handle);
La copie d'image n'est pas lisible (des caractères ont été perdus)

Pour un fichier en code ASCII (.txt) ca fonctionne
hat_et_m est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/08/2011, 22h05   #2
Expert Confirmé
 
Avatar de Séb.
 
Inscription : mars 2005
Messages : 2 823
Détails du profil
Informations personnelles :
Âge : 34
Localisation : France

Informations professionnelles :
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : mars 2005
Messages : 2 823
Points : 3 454
Points : 3 454
Regarde la note à propos des données binaires : http://fr.php.net/manual/fr/function.fopen.php
__________________
Un problème exposé clairement est déjà à moitié résolu
Keep It Smart and Simple
Séb. est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/08/2011, 20h20   #3
Invité régulier
 
Inscription : juin 2006
Messages : 47
Détails du profil
Informations forums :
Inscription : juin 2006
Messages : 47
Points : 7
Points : 7
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
$fichieruploaded="../upload/Photo 014.jpg"; //image de 1.49 Mega-Octets
$fichiertempo="ddsd";
 
$handle = fopen($fichieruploaded, 'rb');
if ($handle){
$i=0;	
while (!feof($handle))	{	
$buffer=fgets($handle);
$buffer_hex=bin2hex($buffer);
$i++;
echo "Ligne$i:".$buffer_hex."<br>";
if(ereg("3c736372697074",$buffer_hex)==true || ereg("3c3f70",$buffer_hex)==true){
echo "ko";break;
}
}
fclose($handle);
 
}
Lorsque j'effectue le test de lecture ci-dessus, j'obtiens 5560 lignes au lieu de 10031 (qui est le nombre de ligne donné par NotePad)

De plus la recherche des chaines de caractères <?p ou <script , ne donne donne pas toujours de résultat lorsque j'introduis ces caractères dans le fichier d'image :

Citation:
Mode de conversion des caractères en hexadécimal
echo "<:".bin2hex("<")."<br>";
echo "?:".bin2hex("?")."<br>";
echo "s:".bin2hex("s")."<br>";
echo "c:".bin2hex("c")."<br>";
echo "r:".bin2hex("r")."<br>";
echo "i:".bin2hex("i")."<br>";
echo "p:".bin2hex("p")."<br>";
echo "t:".bin2hex("t")."<br>";
echo ': :'.bin2hex(" ")."<br>";
echo '\0:'.bin2hex("\0")."<br>";
echo '\t:'.bin2hex("\t")."<br>";
echo '\r:'.bin2hex("\r")."<br>";
echo '\n:'.bin2hex("\n")."<br><br>";
echo bin2hex("<script ")."<br><br>";

/*
<:3c
?:3f
s:73
c:63
r:72
i:69
p:70
t:74
: :20
\0:00
\t:09
\r:0d
\n:0a

*/
Est-ce que les fonctions fopen fgets boguent dans PHP 4.2.0 ?

Je vous propose de faire le même test avec une image de votre choix.

Merci,
J'essaye de comprendre le problème de lecture de fichier en binaire, voilà que pour l'instant j'ai observé les bizzareries que je vous ai décrite plus haut.

Merci de votre aide.
hat_et_m est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/08/2011, 20h27   #4
Modérateur
 
Inscription : septembre 2010
Messages : 7 116
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 116
Points : 8 465
Points : 8 465
pourquoi t'utilises PHP 4.2 ? t'es chez quel hébergeur ?
sinon c'est des metadata que tu veux modifier dans ton image ?
__________________
http://blog.stealth35.com/
stealth35 est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/08/2011, 00h45   #5
Invité régulier
 
Inscription : juin 2006
Messages : 47
Détails du profil
Informations forums :
Inscription : juin 2006
Messages : 47
Points : 7
Points : 7
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
<?php
 
$fichieruploaded="Photo.jpg";//fichier volumineux et "corrompu"
$rep_upload="../upload/";
$rep_tempo_analyse="../analyse_virale/";
$option_analyse=3;
 
if($_GET["compteur"]!=""){
$compteur=intval($_GET["compteur"]);
}else{
$compteur=0;
}
 
function analyse_virale($rep_upload,$fichieruploaded,$option_analyse,$rep_tempo_analyse,$compteur0){
//$chaine_comtpeur_stack.="$compteur.$stack:";
$limite_file=1600000;
$handle = fopen($rep_upload.$fichieruploaded, 'rb');
if ($handle){
$i=0;	$bufferstr='';
$novirus=true;
if($compteur0>0){
fseek($handle,$compteur0,SEEK_SET);
}
while (!(feof($handle)==true||$i>$limite_file))	{	
$i++;
//echo $i.",";
$buffer=fread($handle,1);//lecture octect par octect
$bufferstr.=$buffer;
if($buffer=="\n"){
if(ereg("[#][!][/][u][s][e][r]",$bufferstr)==true || ereg("[#][!][ ][ ]",$bufferstr)==true  || ereg("[#][!][\t]",$bufferstr)==true || ereg("[#][!][\r][\n]",$bufferstr)==true || ereg("[#][!][ ][\r][\n]",$bufferstr)==true || ereg("[#][!][ ][\n]",$bufferstr)==true || ereg("[<][?][p][h][p]",$bufferstr)==true  || ereg("[<][s][c][r][i][p][t]",$bufferstr)==true){
/*si #!(espace espace ou tabulation ou /) ou <?php ou <script trouvé alors le fichier sera analysé manuellement ou détruit  (on vérifie la présence des codes exécutables côté serveur Apache et script côté client) */
$chaine_anlyse=$bufferstr;//$chaine_anlyse=hex2bin($buffer0);
$novirus=false;break;
}
$bufferstr='';
}elseif(feof($handle)==true){
if(ereg("[#][!][/][u][s][e][r]",$bufferstr)==true || ereg("[#][!][ ][ ]",$bufferstr)==true  || ereg("[#][!][\t]",$bufferstr)==true ||  ereg("[#][!][\r][\n]",$bufferstr)==true || ereg("[#][!][ ][\r][\n]",$bufferstr)==true || ereg("[#][!][ ][\n]",$bufferstr)==true || ereg("[<][?][p][h][p]",$bufferstr)==true  || ereg("[<][s][c][r][i][p][t]",$bufferstr)==true){
/*si #!(espace ou tabulation) ou <?php ou <script trouvé alors le fichier sera analysé manuellement ou détruit  (on vérifie la présence des codes exécutables côté serveur Apache et script côté client) */
$chaine_anlyse=$bufferstr;//hex2bin($buffer0);
$novirus=false;break;
}
$bufferstr='';
}
}
fclose($handle);
 
$compteur0=$compteur0+$i-1;
 
if($novirus==false){
if($option_analyse==2){ //on efface le fichier corrompu
unlink($rep_upload.$fichieruploaded);
}elseif($option_analyse==3){ //on met le fichier en zone de quarantaine
rename($rep_upload.$fichieruploaded,$rep_tempo_analyse.$fichieruploaded.".txt");
}
return "Position:$i:".$chaine_anlyse;
}elseif($i>$limite_file){
return array($compteur0,$compteur0);
}
return $compteur0;
}else{
return false;
}
}
 
$sortie=analyse_virale($rep_upload,$fichieruploaded,$option_analyse,$rep_tempo_analyse,$compteur);
 
if(is_array($sortie)==true){
$milieu="<html>
<head>
<title>Redirection en htm</title>
<meta http-equiv=\"refresh\" content=\"1; URL=analyse_file.php?compteur=".$sortie[1]."\">
</head>
<body>".$sortie[1]."<br>
$suite_compteur
</body>
</html>";
//header("Location:analyse_file.php?compteur=".$sortie[1]."&suite=$suite_compteur");
}else{
 
$milieu="<html>
<head>
<title></title>
</head>
<body>
$sortie<br>
$suite_compteur
</body>
</html> ";
}
 
echo $milieu;
 
?>
Le code ci-dessus fonctionnera quelque soit la taille du fichier ; c'est pour permettre une analyse virale systématique ;

en lisant octect par octet le fichier avec fread($file,1); on procède à un traitement par lot
hat_et_m est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 14h26.


 
 
 
 
Partenaires

Hébergement Web