Précédent   Forum des professionnels en informatique > PHP > Langage
Langage Forum sur le langage PHP, la POO, les conventions, la sécurité, etc. Avant de poster : FAQ Langage, toutes les FAQ PHP, cours langage et sources PHP
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 24/01/2011, 16h32   #1
Membre confirmé
 
Inscription : février 2009
Messages : 317
Détails du profil
Informations forums :
Inscription : février 2009
Messages : 317
Points : 209
Points : 209
Par défaut Generation de fichier Vcard

Bonjour,
Mon site a la possibilité de générer des fichiers .vcf ou Vcard.
Seulement, lorsque je télécharge mon fichier vcard depuis mon site, impossible de l'ouvrir...
Et la ou ca devient bizarre, j'ouvre le fichier téléchargé avec notepadd, je copie le code, et je le met dans un nouveau fichier vcf fraichement crée en local; et la ça fonctionne...
Je ne vois pas d'où ca peut venir.
Avez vous une explication ?
insane1 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/01/2011, 10h51   #2
Membre confirmé
 
Inscription : février 2009
Messages : 317
Détails du profil
Informations forums :
Inscription : février 2009
Messages : 317
Points : 209
Points : 209
Apparemment cela viendrait d'un problème d'encodage.
Code :
1
2
3
4
5
6
header("Content-disposition: attachment; filename=" . $nom . ".vcf"); 
		header("Content-Type: text/x-vcard; charset=iso-8859-1"); 
		header("Pragma: no-cache"); 
		header("Cache-Control: must-revalidate, post-check=0, pre-check=0, public"); 
		header("Expires: 0");
		echo $resultat;
Mais même en mettant le charset en iso, mon fichier reste encodé en UTF8.
Or avec l'UTF8 ca ne fonctionne pas...
insane1 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/01/2011, 13h48   #3
Expert Confirmé Sénior
 
Inscription : septembre 2004
Messages : 5 053
Détails du profil
Informations forums :
Inscription : septembre 2004
Messages : 5 053
Points : 6 967
Points : 6 967
C'est bien de donner le code PHP, mais on ne sait pas d'où vient $resultat.

Par ailleurs, une URL aiderait à y voir clair.
thelvin est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/01/2011, 13h58   #4
Membre confirmé
 
Inscription : février 2009
Messages : 317
Détails du profil
Informations forums :
Inscription : février 2009
Messages : 317
Points : 209
Points : 209
$resultat vient de cette fonction (un peu longue)

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
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
function out($buffer)
		{
			$entry   = '';
			$header  = 'BEGIN:VCARD' . "\r\n";
			$header .= 'VERSION:2.1' . "\r\n";
			//$header .= 'X-PHPGROUPWARE-FILE-AS:phpGroupWare.org' . "\r\n";
 
			$workaddr = $hoeaddr = $this->address;
			reset($this->export);
			while ( list($name,$value) = each($this->export) )
			{
				if (!empty($buffer[$name]))
				{
					$buffer[$name] = utf8_decode($buffer[$name]);
					$mult = explode(';',$value);
					if (!$mult[1])
					{ // Normal
						if (strstr($buffer[$name],"\r\n") || strstr($buffer[$name],"\n") || (strtoupper($mult[0])=='FN'))
						{
							$buffer[$name] = $this->vCard_encode($buffer[$name], 'QUOTED-PRINTABLE', false);
							$entry .= $value . ';ENCODING=QUOTED-PRINTABLE:' . $buffer[$name]."\r\n";
						}
						else
						{
							$entry .= $value . ':' . $buffer[$name] . "\r\n";
						}
					}
					else
					{
						switch ($mult[0])
						{
							case 'N':
								switch ($mult[1])
								{
									case 'PREFIX':
										$prefix    = ';' . $this->vCard_encode($buffer[$name], 'QUOTED-PRINTABLE', false);
										break;
									case 'GIVEN':
										$firstname = ';' . $this->vCard_encode($buffer[$name], 'QUOTED-PRINTABLE', false);
										break;
									case 'MIDDLE':
										$middle    = ';' . $this->vCard_encode($buffer[$name], 'QUOTED-PRINTABLE', false);
										break;
									case 'FAMILY':
										$lastname  =       $this->vCard_encode($buffer[$name], 'QUOTED-PRINTABLE', false);
										break;
									case 'SUFFIX':
										$suffix    = ';' . $this->vCard_encode($buffer[$name], 'QUOTED-PRINTABLE', false);
										break;
								}
								break;
							case 'ORG':
								switch ($mult[1])
								{
									case 'NAME':
										$org_name = $this->vCard_encode($buffer[$name], 'QUOTED-PRINTABLE', false);
										break;
									case 'UNIT':
										$org_unit = ';' . $this->vCard_encode($buffer[$name], 'QUOTED-PRINTABLE', false);
										break;
								}
								break;
							case 'ADR':
								switch ($mult[1])
								{
									case 'TYPE':
										if(isset($typei[$mult[2]]))
										{
											$typei[$mult[2]] .= ';';
										}
 
										$types = explode(';',$buffer[$name]);
										if ($types[1])
										{
											$typei[$mult[2]] .= strtoupper($types[0][1]);
											for ($i=1; $i<count($types); $i++)
											{
													$typei[$mult[2]] .= ',' . strtoupper($types[$i][1]);
											}
										}
										elseif ($types[0])
										{
											$typei[$mult[2]] .= strtoupper($types[0]);
										}
										else
										{
											$typei[$mult[2]] .= strtoupper($buffer[$name]);
										}
										//echo "TYPE=".$typei[$mult[2]];
										break;
									case 'WORK':
										$workaddr[$mult[2]] = $buffer[$name];
										$workattr = $mult[0] . ';TYPE=' . $typei[$mult[1]];
										break;
									case 'HOME':
										$homeaddr[$mult[2]] = $buffer[$name];
										$homeattr = $mult[0] . ';TYPE=' . $typei[$mult[1]];
										break;
									default:
										break;
								}
								break;
							case 'TEL':
								switch($mult[1])
								{
									case 'PREFER':
										$prefer = explode(';',$buffer[$name]);
										if ($prefer[1])
										{
											while ($pref = strtoupper(each($prefer)))
											{
												$prefi[$pref] = ';PREF';
											}
											//echo 'PREF1';
										}
										elseif ($prefer[0])
										{
											$prefi[strtoupper($prefer[0])] = ';PREF';
											//echo 'PREF='.strtoupper($prefer[0]);
										}
										elseif ($buffer[$name])
										{
											$prefi[$buffer[$name]] = ';PREF';
											//echo 'PREF3';
										}
										break;
									case 'WORK':
										// Wow, this is fun!
										$entry .= 'A.' . $mult[0] . ';' . $mult[1] . $prefi[$mult[1]] . ';' . $mult[2] . ':' . $buffer[$name] . "\r\n";
										break;
									case 'HOME':
										$entry .= 'B.' . $mult[0] . ';' . $mult[1] . $prefi[$mult[1]] . ';' . $mult[2] . ':' . $buffer[$name] . "\r\n";
										break;
									default:
//										echo $mult[0] . ';' . $mult[1] . $prefi[$mult[1]] . ':' . $buffer[$name] . "\r\n";
//										echo '<br />';
										$entry .= $mult[0] . ';' . $mult[1] . $prefi[$mult[1]] . ':' . $buffer[$name] . "\r\n";
										break;
								}
								break;
							case 'EMAIL':
								switch($mult[1])
								{
									case 'TYPE':
										if ($mult[2] == 'WORK') { $emailtype  = ';' . $buffer[$name]; }
										if ($mult[2] == 'HOME') { $hemailtype = ';' . $buffer[$name]; }
										break;
									case 'WORK':
										$newval = 'A.'.$value;
										$entry .= $newval . $emailtype . ':' . $buffer[$name] . "\r\n";
										break;
									case 'HOME':
										$newval = 'B.' . $value;
										$entry .= $newval . $hemailtype . ':' . $buffer[$name] . "\r\n";
										break;
									default:
										break;
								}
								break;
							case 'URL':
								$entry .= $value . ":" . $buffer[$name] . "\r\n";
								break;
							default:
								break;
						} //end switch ($mult[0])
					} //end else
				} //end if (!empty)
			} //end while
			$entries .= $header;
 
			if(!$middle)
			{
				$middle = ';';
			}
 
			if(!$prefix)
			{
				$prefix = ';';
			}
 
			$n = $lastname . $firstname . $middle . $prefix . $suffix;
			$entries .= 'N;ENCODING=QUOTED-PRINTABLE:' . $n . "\r\n";
			$entries .= $entry;
 
			if (!$buffer['full_name'])
			{
				if ($lastname || $firstname)
				{
					$fn = substr($firstname,1) . ' ' . $lastname;
					$entries .= 'FN;ENCODING=QUOTED-PRINTABLE:' . $fn . "\r\n";
				}
			}
			if ($org_name || $org_unit)
			{
				$entries .= 'ORG;ENCODING=QUOTED-PRINTABLE:' . $org . "\r\n";
			}
 
			$workattr = ereg_replace('ADR;','',$workattr);
			// remember the correct order of address fields!
			$workaddr['POSTOFFICEBOX'] = $this->vCard_encode($workaddr['POSTOFFICEBOX'], 'QUOTED-PRINTABLE', false);
			$workaddr['EXT']           = $this->vCard_encode($workaddr['EXT'], 'QUOTED-PRINTABLE', false);
			$workaddr['STREET']        = $this->vCard_encode($workaddr['STREET'], 'QUOTED-PRINTABLE', false);
			$workaddr['LOCALITY']      = $this->vCard_encode($workaddr['LOCALITY'], 'QUOTED-PRINTABLE', false);
			$workaddr['REGION']        = $this->vCard_encode($workaddr['REGION'], 'QUOTED-PRINTABLE', false);
			$workaddr['POSTALCODE']    = $this->vCard_encode($workaddr['POSTALCODE'], 'QUOTED-PRINTABLE', false);
			$workaddr['COUNTRYNAME']   = $this->vCard_encode($workaddr['COUNTRYNAME'], 'QUOTED-PRINTABLE', false);
			$workaddr = $workaddr['POSTOFFICEBOX'].';'.$workaddr['EXT'].';'.$workaddr['STREET'].';'.$workaddr['LOCALITY'].';'.$workaddr['REGION'].';'.$workaddr['POSTALCODE'].';'.$workaddr['COUNTRYNAME'];
			$work = 'A.ADR;' . $workattr . ';ENCODING=QUOTED-PRINTABLE:' . $workaddr . "\r\n";
			$wlabel = 'LABEL;TYPE=WORK;;ENCODING=QUOTED-PRINTABLE:' . $wlabel . "\r\n";
 
			$homeattr = ereg_replace('ADR;','',$homeattr);
			// remember the correct order of address fields!
			$homeaddr['POSTOFFICEBOX'] = $this->vCard_encode($homeaddr['POSTOFFICEBOX'], 'QUOTED-PRINTABLE', false);
			$homeaddr['EXT']           = $this->vCard_encode($homeaddr['EXT'], 'QUOTED-PRINTABLE', false);
			$homeaddr['STREET']        = $this->vCard_encode($homeaddr['STREET'], 'QUOTED-PRINTABLE', false);
			$homeaddr['LOCALITY']      = $this->vCard_encode($homeaddr['LOCALITY'], 'QUOTED-PRINTABLE', false);
			$homeaddr['REGION']        = $this->vCard_encode($homeaddr['REGION'], 'QUOTED-PRINTABLE', false);
			$homeaddr['POSTALCODE']    = $this->vCard_encode($homeaddr['POSTALCODE'], 'QUOTED-PRINTABLE', false);
			$homeaddr['COUNTRYNAME']   = $this->vCard_encode($homeaddr['COUNTRYNAME'], 'QUOTED-PRINTABLE', false);
			$homeaddr = $homeaddr['POSTOFFICEBOX'].';'.$homeaddr['EXT'].';'.$homeaddr['STREET'].';'.$homeaddr['LOCALITY'].';'.$homeaddr['REGION'].';'.$homeaddr['POSTALCODE'].';'.$homeaddr['COUNTRYNAME'];
			$home = 'B.ADR;' . $homeattr . ';ENCODING=QUOTED-PRINTABLE:' . $homeaddr . "\r\n";
			$hlabel = 'LABEL;TYPE=HOME;;ENCODING=QUOTED-PRINTABLE:' . $hlabel . "\r\n";
 
			$entries = ereg_replace('PUBKEY','KEY',$entries);
			$entries .= $work . $home . $wlabel . $hlabel . 'END:VCARD' . "\r\n";
			$entries .= "\r\n";
 
			$buffer = $entries;
			return $buffer;
		} //end function
Vous ne pouvez par contre pas avoir une URL car une identification est requise et les inscriptions sont fermées pour l'instant.
insane1 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/01/2011, 10h50   #5
Expert Confirmé Sénior
 
Inscription : septembre 2004
Messages : 5 053
Détails du profil
Informations forums :
Inscription : septembre 2004
Messages : 5 053
Points : 6 967
Points : 6 967
Citation:
Envoyé par insane1 Voir le message
$resultat vient de cette fonction (un peu longue)
Bon, je voulais juste voir si ça ne faisait pas des bêtises d'encodage qui s'effaceraient au premier copier/coller ou ce genre de choses.
Mais je fais pas de PHP, ce code me dépasse.

Citation:
Envoyé par insane1 Voir le message
Vous ne pouvez par contre pas avoir une URL car une identification est requise et les inscriptions sont fermées pour l'instant.
Ah bah oui ça va être pratique. Je sais pas, un petit dump Wireshark ou HTTP Live Headers, peut-être ?
thelvin est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/03/2011, 04h43   #6
Invité de passage
 
Inscription : janvier 2009
Messages : 1
Détails du profil
Informations forums :
Inscription : janvier 2009
Messages : 1
Points : 1
Points : 1
Par défaut Ton code a l'air bon...

J'ai pas mal galéré et pas encore testé l'import d'une vcard dans toutes les messageries mais mon code est celui-çi :
Code php :
1
2
3
4
5
6
7
8
9
10
11
function savemyVcard(){
 $content = $this->toString();
 header("Content-Disposition: attachment; filename={$this->name}.vcf");
 header("Content-Type: text/x-vcard; charset=utf-8");
 header("Expires: Mon, 26 Jul 1997 05:00:00 GMT" );
 header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT" );
 header("Cache-Control: max-age=0");
 header("Pragma: public");
 header("Content-Length: ".strlen($content));
 print $content;
}

tu feras le lien avec ton $resultat etc...
franckt13 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 04h15.


 
 
 
 
Partenaires

Hébergement Web