IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Enregistrement d'un fichier avec ouverture de la boîte de dialogue


Sujet :

Langage PHP

  1. #1
    Membre éclairé
    Homme Profil pro
    Ingénieur en électrotechnique retraité
    Inscrit en
    Décembre 2008
    Messages
    1 642
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur en électrotechnique retraité

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 642
    Points : 831
    Points
    831
    Par défaut Enregistrement d'un fichier avec ouverture de la boîte de dialogue
    Bonjour,

    Je souhaite forcer l'ouverture de la boîte de dialogue pour enregistrer un fichier sur l'ordinateur client. En m'inspirant de la doc et de différents exemples, j'ai écrit ce code qui ne fonctionne pas. Il enregistre le fichier reproduit après le code.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    function vcf_headers($outputfileName,$pathVCF) {
    	// disable caching
    	$now = gmdate("D, d M Y H:i:s");
    	header("Expires: Tue, 03 Jul 2001 06:00:00 GMT");
    	header("Cache-Control: max-age=0, no-cache, must-revalidate, proxy-revalidate");
    	header("Last-Modified: {$now} GMT");
     
    	// force download  
    	header("Content-Type: application/force-download");
    	header("Content-Type: application/octet-stream");
    	header("Content-Type: application/download");
     
    	// file weight
    	header("Content-Length: " . filesize($pathVCF));
     
    	// encrypt output in utf-8
    	header('Content-Type: text/html; charset=utf-8');
     
    	// disposition / encoding on response body
    	header("Content-Disposition: attachment;filename={$outputfileName}");
    	header("Content-Transfer-Encoding: binary");
    }
     
    $vcf = "Un texte";
     
    $errors[0] = '';
     
    $filename = $person->FN . '.vcf';
    $context = stream_context_create( vcf_headers($filename, "./export-".uniqid()) );
     
    if ( file_put_contents($filename, $vcf, false, $context) ) { $errors[0] = VCF_ERR_OK; }
    else { $errors[] = VCF_ERR_NO; }
    $_SESSION['errors'] = $errors;
    <br />
    <b>Warning</b>: filesize(): stat failed for ./export-5c838ad72b412 in <b>C:\wamp64\www\proginet\appOmnes\handleExportVCF.php</b> on line <b>68</b><br />
    Je comprends l'erreur mais je ne vois pas comment la corriger. Ce n'est d'ailleurs peut-être pas la seule.

  2. #2
    Membre éclairé
    Homme Profil pro
    Ingénieur en électrotechnique retraité
    Inscrit en
    Décembre 2008
    Messages
    1 642
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur en électrotechnique retraité

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 642
    Points : 831
    Points
    831
    Par défaut
    J'ai trouvé une partie de la solution en réécrivant la fonction vcf_headers comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    function vcf_headers($outputfileName,$pathVCF) {
    	$now = gmdate("D, d M Y H:i:s"); // voir GMT ou local
     
    	$options = ['http' => [
    		'header' => [
     
    			// disable caching
    			"Expires: Tue, 03 Jul 2001 06:00:00 GMT", // voir GMT ou local
    			"Cache-Control: max-age=0, no-cache, must-revalidate, proxy-revalidate",
    			"Last-Modified: {$now} GMT", // voir GMT ou local
     
    			// ...
     
    			]
    		]
    	];
     
    	return $options;
    }
    Malheureusement, j'ai encore deux problèmes:
    • la boîte de dialogue n'apparaît pas,
    • "Content-Length: " provoque toujours l'erreur indiquée plus haut.

  3. #3
    Expert éminent sénior

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 389
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 389
    Points : 10 422
    Points
    10 422
    Par défaut
    Salut,

    As-tu essayé de faire fonctionner le code de la doc php donné dans l'exemple n°1 ?

  4. #4
    Membre éclairé
    Homme Profil pro
    Ingénieur en électrotechnique retraité
    Inscrit en
    Décembre 2008
    Messages
    1 642
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur en électrotechnique retraité

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 642
    Points : 831
    Points
    831
    Par défaut
    J'ai complètement réécrit mon code et j'y suis arrivé. Voici ce que ça donne. C'est beaucoup plus simple qu'initialement.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    function setHeaders($outputfileName,$filesize) {
    	$now = date('y-m-d H:i:s');
     
    	// disable caching
    	header("Expires: Tue, 03 Jul 2001 06:00:00 GMT");
    	header("Cache-Control: max-age=0, no-cache, must-revalidate, proxy-revalidate");
    	header("Last-Modified: {$now}");
     
    	// force download  
    	header("Content-Type: application/force-download");
    	header("Content-Type: application/octet-stream");
    	header("Content-Type: application/download");
     
    	// file weight
    	header("Content-Length: {$filesize}");
     
    	// encrypt output in utf-8
    	header("Content-Type: text/html; charset=utf-8");
     
    	// disposition / encoding on response body
    	header("Content-Disposition: attachment;filename={$outputfileName}");
    	header("Content-Transfer-Encoding: binary");
    }
     
     
    $outputfileName = encoding( trim($person->FN), 'ASCII' ).'.vcf';
    if ( $vcf ) {
     
    	$buffer = encoding($vcf, 'utf-8');
     
    	$filesize = strlen($buffer);
     
    	// Définition des headers
    	setHeaders($outputfileName,$filesize);
     
    	// Enregistrement
    	echo $buffer;
    	exit;
    }

  5. #5
    Membre éclairé
    Homme Profil pro
    Ingénieur en électrotechnique retraité
    Inscrit en
    Décembre 2008
    Messages
    1 642
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur en électrotechnique retraité

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 642
    Points : 831
    Points
    831
    Par défaut
    Non, je n'ai pas essayé readfile parce que (excuse à deux balles) dans la panoplie des fonctions php je ne trouve pas toujours celle qui est le mieux adaptée.
    Vu que je ne lis pas un fichier mais que je crée une chaîne, je pense que ce que j'ai fait n'est pas si mal.
    En tous cas, merci. J'essaierai d'y penser une prochaine fois.

  6. #6
    Expert éminent sénior

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 389
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 389
    Points : 10 422
    Points
    10 422
    Par défaut
    Je t'avais donné l'exemple de la doc pour les headers mais effectivement readfile n'est adapté que pour lire des fichiers et non pas si l'on crée du html (ou autre) à la volée avec un buffer par exemple.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Débutant] Réception et enregistrement d'un fichier avec C# et .ASP
    Par Invité dans le forum ASP.NET
    Réponses: 4
    Dernier message: 22/06/2017, 13h32
  2. Enregistrement automatique de fichiers avec Macros
    Par ExcelLiod dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 16/12/2015, 20h45
  3. Réponses: 15
    Dernier message: 20/06/2008, 15h36
  4. Enregistrer sur un fichier avec Actionscript
    Par sparil dans le forum Dynamique
    Réponses: 3
    Dernier message: 22/06/2007, 11h00
  5. enregistrer dans un fichier avec une appli mdi
    Par ferrari dans le forum C++Builder
    Réponses: 4
    Dernier message: 05/05/2002, 16h17

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo