8768 sujets

Développement web côté serveur, CMS

Bonjour,

je viens vers vous car je ne trouve pas mon bonheur pour réaliser l'opération, pourtant simple qu'est le téléchargement d'un fichier depuis le serveur web.

voici le fonctionnement de ma page html:
1) sélection des paramètres de recherches
2) sélection si téléchargement pour correction ou non
3) lors du submit, je fais un envoie ajax, qui fonctionne parfaitement pour l'affichage comme pour la création de mon fichier sur le serveur.
si je choisi l'option "pour correction", mon serveur doit forcé le téléchargement dudit fichier. mais la cela ne fonctionne pas.

Dans le code coté serveur ( php), je vais vous épargner toute la partie requête qui n'as pas d’interet pour le traitement vue que cela fonctionne parfaitement.


// début du traitement dans mon fichier PHP

if ($_SERVER["REQUEST_METHOD"]=="POST") {
// traitement des erreurs +  récupération des données variable + traitement de la requete

// code pour  la création du fichier  lancé après la requête.
if ($array1['download']=='correction'){
                preparefichier($query);
                $array1["isSucces"] =true;
            }  
// traitement des données pour constituer mon array de retour vers ajax.
// fin de mon if sur le REQUST_METHOD
}
// la je tente de forcer le téléchargement
if($array1['download']=='pour correction' && $array1['isSuccess']==true) {
    //          procédure pour télécharger automatiquement pas finaliser
    forcerTelechargement('SORTIE_RECUP', 'SORTIE_RECUP');
    }
// je passe maintenant aux fonctions.
//fonction pour créer le fichier

function preparefichier($query){

    $row="";
      //prépation du fichier
        $filename = "SORTIE_RECUP";
           if (!$handle = fopen($filename, 'w')) {
             echo "Impossible d'ouvrir le fichier ($filename)";
             exit;
         }
    
    $conn = oci_connect('user', 'password', 'ip_serveur/instance','UTF8');
    $std=oci_parse($conn,$query);
    $result=oci_execute($std);
   while($row = oci_fetch_array($std)){
    
    $prnom = $row[1];
    $reference = $row[2];
    $service = $row[3];
    $quantite = $row[4];
    $datemvt = $row[5];
    
    $numMVT =$row[10];
//            permet de faire le complement de 0 pour le fichier
    $qt =  str_pad($quantite,4,0,STR_PAD_LEFT);            
//            test si la qantité est négative à faire confirmé sur un mouvement negatif manquant...
    if ($quantite >0){
        $signe="-";
    }else{
        $signe="+";
    }
    if ($service=="6210M"){
        $service="6210";
    }
    if ($service=="0066A"){
        $service="0066";
    }
    if ($service=="0066B"){
        $service="0066";
    }
    
    $qt=control_qt($qt);
    
    $fields = "test;SD;unité;test;".$datemvt.";".$numMVT.";".$service.";;".substr($reference,0,6).";".substr($reference,-1,1).";;".$qt.".000;;\n";
    fputs($handle,$fields);
   }
   
//fermeture du fichier aprés écriture.
    fflush($handle);
    fclose($handle);    
//          procédure pour télécharger automatiquement pas finaliser
    // forcerTelechargement('SORTIE_RECUP', 'SORTIE_RECUP');
}


fichier php inclus dans le précédent pour forcer le téléchargement, comme vous pouvez le voir il n'est pas de moi mais il fonctionne parfaitement sur d'autre page PHP qui l'utilise.

<?php
 /*******************************************************
* Déclaration de la fonction
*******************************************************/

/**
* La fonction force le téléchargement d'un fichier
*
* @author : Hugo HAMON
* @param : string $nom nom du fichier
* @param : string $situtation emplacement sur le serveur web
* @return : void
**/

function forcerTelechargement($nom, $situation)
{
    //  echo '<a href="'.$situation.'" target="_blank"></a>';
    //$poids=filesize($nom);
    header('Content-Description: File Transfer');
    header('Content-Type: application/force-download');
    header('Content-Type: application/x-rar-csv');
    //header('Content-Length: '.filesize($nom));
    header('Content-Transfer-Encoding: binary');
    header('Content-disposition: attachment; filename='. $nom);
    header('Pragma: no-cache, public');
    header('Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0');
    header('Expires: 0');
    ob_clean();
    flush();
    readfile($situation);
  
    exit();
}
?>



ou est mon erreur de compréhension pour forcer se GRRRRRR de fichier.

merci à ceux qui lirons ce long message et double merci pour ceux qui pourrons m'apporter des pistes de réflexion pour avancer.
Modérateur
Si c'est une requête ajax ça ne déclenchera jamais un téléchargement… pour ce faire il faut changer window.location.

Par ailleurs:


header('Content-Type: application/force-download');
header('Content-Type: application/x-rar-csv');

Je ne suis pas sûr que transmettre coup sur coup deux mime-type fantaisistes et invalides soit de bon ton.

header('Content-Transfer-Encoding: binary');

Content-Transfer-Encoding est un header MIME destiné aux e-mails, il ne sert à rien pour HTTP (qui est de-facto binaire).


header('Pragma: no-cache, public');
header('Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0');
header('Expires: 0');

Nerveux sur le cache? Mais on peut aussi la faire courte:

header('Cache-Control: private');


Ce qui donnerait une fois consolidé:

  header('Content-Description: File Transfer');
  header('Content-Type: text/csv');
  header('Content-Disposition: attachment; filename="'.$nom.'.csv"');
  header('Cache-Control: private');
Meilleure solution
Super merci beaucoup,

j'ai modifier mon fichier php sur te préconisation.

pour ce qui est du téléchargement, j'ai fais ceci dans mon fichier JS en fin de traitement du retour ajax:

if(result.succes.download=="correction"){
              var CheminComplet = document.location.href;
              var CheminRepertoire  = CheminComplet.substring( 0 ,CheminComplet.lastIndexOf( "/" ) );
              window.location=CheminRepertoire+"/SORTIE_RECUP";
            }


et cela fonctionne super bien.

merci pour le coup de pouce.