Blog d'un développeur multi-support

[DIM] pour les intimes :)

iPhone & Requete HTTP

Yop all,

A la demande général de Fabrice Bernhard, voici une classe que j’ai faite pour me simplifier la vie quand je dois faire une requête HTTP. Vous me direz « pas besoin blabla », mais cette classe gère l’envoie d’images, de sons en plus de simple paramètres POST classique. Vous faites moins les malins hein :) Et si je vous dit qu’elle gère aussi si la requête doit être fait en mode synchrone ou asynchrone hein ? Ça t’en bouche un coin ?

Bah en fait elle est très simple, j’ai juste joué au légo avec les classes Apple, mais c’est un lego qui me sert pas mal.

Voici un exemple d’utilisation, ce code est tiré de l’exemple que j’ai fait pour vous, disponible en téléchargement :

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
-(IBAction) send
{
// Crée la requete en mode asynchrone
HttpRequest *masuperRequete = [[HttpRequest alloc] initHttpRequest:formUrlAsk.text isSynchronous:false];
 
// Ajoute un parametre POST['cleParam'];
[masuperRequete addParam:@"cleParam" valeurs:formParam.text];
 
// Ajoute un fichier Image. Les parametres seront sous la forme file1, file2, file3 .. etc
[masuperRequete addImage:imageTmp.image];
 
// ajoute un son
// On doit recuperer les données du son sous la forme d'un NSDATA
// Ici le son est distant .. on le recupère donc avec the super classe en mode syncrhone
HttpRequest *sousReq = [[HttpRequest alloc] initHttpRequest:formUrlSound.text isSynchronous:true];
NSData * dataSound = [sousReq send];
 
// Recupere le nom du son
NSArray * mots = [formUrlSound.text componentsSeparatedByString:@"/"];
NSString *nameoffile = [mots lastObject];
 
[masuperRequete addSound:dataSound nameoffile:nameoffile nameinform:@"mamusique"];
 
// Envoie la superRequete
masuperRequete.delegate = self;
[masuperRequete send];
}
 
// y a un delegate pour recup le retour de la requete en mode asynchrone
-(void)downloadFinish:(NSMutableData *)data
{
NSLog(@"telechargement termine");
}

Maintenant voici le code source complet de l’exemple

Exemple de la classe HTTPRequest

Pour récupérer les données par la suite, rien de plus simple tout est dans $_POST et $_FILES.

maj : voilà le code source du fichier php que j’ai utilisé :

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
 
<?php
 
$content_dir = 'upload/';
 
if(count($_POST) > 0 || count($_FILES) > 0)
{
 
 
 
 
	if(count($_POST) > 0)
	{
		echo "variable POST : \n";
		foreach($_POST as $cle=>$val)
			echo $cle . ' => ' . $val ."\n";
 
		if(isset($_POST['monson']))
		{
			$test = base64_decode($_POST['monson']);
 
			$file = fopen("upload/son.caf","w+");
 
			fwrite($file,$test);
 
			fclode($file);
		}
 
	}
 
	if(count($_FILES) > 0)
	{
		echo "variable FILES : \n";
		foreach($_FILES as $cle=>$image)
		{
 
			$tmp_file = $image['tmp_name'];
 
			if(!empty($tmp_file))
			{
 
 
				if( !is_uploaded_file($tmp_file) )
				{
					exit("Le fichier est introuvable");
				}
 
				// on vérifie maintenant l'extension
				$type_file = $image['type'];
 
				if( !strstr($type_file, 'jpg') &#038;&#038; !strstr($type_file, 'jpeg') &#038;&#038; !strstr($type_file, 'bmp') &#038;&#038; !strstr($type_file, 'png') &#038;&#038; !strstr($type_file, 'gif') )
				{
					//exit("Le fichier n'est pas une image");
				}
 
				// on copie le fichier dans le dossier de destination
				$name_file = $image['name'];
 
				echo $cle. " => " .$name_file ." reçu \n";
 
				if( !move_uploaded_file($tmp_file, $content_dir . $name_file) )
				{
					exit("Impossible de copier le fichier dans $content_dir");
				}
 
			}
	}
}
}
else
{
	 $rep = "upload/";
	$dir = opendir($rep);
 
	while ($f = readdir($dir)) {
  	 if(is_file($rep.$f)) {
    		echo "<li>Nom : ".$f;
		echo '<a href="upload/'.$f.'"> DL </a>';
      		echo "<li>Taille : ".filesize($rep.$f)." octets";
      		echo "<br /><br />";
   		}
	}
}
 
 ?>

Précisons quand même que ma classe est en alpha, certaines fonctionnalités ne sont pas implémentés. Je pense notamment à la gestion des erreurs, le qui donne le taux de progression de l’upload etc. Je vous laisse le faire :p

Enjoy !

Image representing Apple as depicted in CrunchBase

Image via CrunchBase

Tags : , , , ,
Catégorie : iPhone, Mobile
  • Eko a dit :

    Ouais enfin si c’est a la demande de Fabrice Bernhard, c’est pas à la demande générale.

    10.07.2009 à 17h37
  • Guillaume chave a dit :

    T’a pas compris la note d’ironie toi .. ou le trait d’humour c’est toi qui voit ..
    retourne à ton php va

    10.07.2009 à 17h46
  • Alain a dit :

    Félicitations pour ce beau boulot !
    Pourrais-tu communiquer le contenu du fichier upload.php ?
    D’avance merci …

    25.07.2009 à 14h10
  • Guillaume chave a dit :

    Ouais, je vais mettre le code que j’ai utilisé pour tester qui n’est pas sécurisé etc mais bon .. je vais éditer l’article

    25.07.2009 à 15h02
  • Alain a dit :

    OK, mais désolé de te mettre la pression mais j’ai un besoin un peu (très) urgent de test … très très urgent !
    Je galère depuis 3 jours sur ce problème d’upload et ta solution semble fiable.
    Merci donc de me communiquer le contenu du PHP et merci encore pour avoir partagé ton boulot.

    25.07.2009 à 15h29
  • Guillaume chave a dit :

    ben je l’ai mis dans l’article tout à l’heure … deplie l’encadrer pour le voir en plein :p

    25.07.2009 à 16h25
  • Alain a dit :

    Je n’avais pas fait attention … Merci !

    25.07.2009 à 16h35
  • Alain a dit :

    J’ai une erreur de parsing sur la ligne 51. Il s’agit de code PHP 5 ?

    25.07.2009 à 17h28
  • Alain a dit :

    + quelle est l’arborescence nécessaire sur le site ?
    J’ai créé un seul répertoire « upload » à la racine ; est-ce suffisant ?

    Merci encore !

    25.07.2009 à 17h35
  • Guillaume chave a dit :

    arbo :

    www/
    upload.php
    upload/

    Pour la ligne 51 il s’agit d’un bug wordpress lié au blog : les && sont remplacés par les équivalents html.

    Et désolé d’être si brutal mais il s’agit d’un article iphone, c’est pas le lieu idéal pour des « problêmes » php … surtout quand c’est si « basique » ..

    25.07.2009 à 18h22

Votre adresse email ne sera pas publiée. Champs requis marqués avec *

*