Partage
  • Partager sur Facebook
  • Partager sur Twitter

Faire un "Ouvrir avec..." ?

Sujet résolu
    14 avril 2020 à 11:08:56

    Bonjour tout le monde.

    Avec tout ce que j'ai pu récupérer sur le site, je me bats pour faire un "Ouvrir avec".

    Il faut que je propose d'ouvrir ou de télécharger des fichiers qui sont sur le serveur.

    Ces fichiers pourront être txt, csv ou xls.

    Voici ce que j'ai fait et qui ne fonctionne pas du tout.

    function OuvreFic(P_Fichier)
    {
    	writeFile(G_FICLOG, "OuvreFic(" + P_Fichier + ")", "OUI");
    
    	alert("Ouverture du fichier : " + P_Fichier);
    	
    //	download_bis(P_Fichier, "il faut lire le fichier texte pour le charger");
    	
        $.ajax(
        {
            type: "POST",
            url: "./PHP/Download.php",
            data: {NomFichier : P_Fichier},
            async: false,
            error : function()
            {
                alert("Echec de l'envoi de la requête -> Donwload.php : " + P_Fichier);
            },
            success: function(data)
            {
    console.log("OuvreFic - SUCCESS Donwload.php - "+P_Fichier);
    console.log("data="+data);		
    //			console.log("envoyé avec succès");
            }
        });
    }
    
    <?php
    
    //echo(NomFichier);
    //
    //	$file = $_GET['NomFichier'];
    //
    ////	header('Content-Transfer-Encoding: binary');
    ////	header('Content-Disposition: attachment; filename="' . $file . '"'); //Nom du fichier
    //	header("Content-type: text/plain; charset=utf-8"); 
    //	header("Content-type: text/csv; charset=utf-8"); 
    //	header("Content-type: application/vnd.ms-excel");
    //
    //header("Content-Type: application/force-download");
    //header("Content-Type: application/octet-stream");
    //header("Content-Type: application/download");
    //header("Content-Disposition: attachment; filename=\"$file\"");
    //header("Pragma: public");
    //header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
    //
    //	//readfile('/volume1/web/CTRL_BDD_MULTIVAC_SG/LOG/2020_04_10_LOG_CTRL_BDD_MULTIVAC_SG.txt');// nom (et emplacement) du fichier dans le serveur
    //
    //	readfile($file);// nom (et emplacement) du fichier dans le serveur
    
    
    
    $file=$_POST['NomFichier'];
    
    if (($file != "")// && (file_exists("php/files/" . basename($file))))
    {
    //$size = filesize("php/files/" . basename($file));
    header("Content-Type: application/force-download; name=\"" . basename($file) . "\"");
    header("Content-Transfer-Encoding: binary");
    //header("Content-Length: $size");
    header("Content-Disposition: attachment; filename=\"" . basename($file) . "\"");
    header("Expires: 0");
    header("Cache-Control: no-cache, must-revalidate");
    header("Pragma: no-cache");
    readfile(basename($file));
    	
    echo("file=" . $file);
    	
    exit();
    }
    ?>
    

    Merci d'avance pour votre aide.

    (C'est pas le confinement qui va me faire craquer, c'est de ne pas arriver à faire ça :D ;) :D


    • Partager sur Facebook
    • Partager sur Twitter
      14 avril 2020 à 16:41:30

      Hello !

      Le chemin de ton fichier c'est basename($file) ? Si c'est pas le cas, alors ton readfile() est pas bon ;)

      Nico.

      • Partager sur Facebook
      • Partager sur Twitter
        14 avril 2020 à 17:17:38

        Oui, oui, c'est bien ça.

        De toutes façons, j'ai testé avec et sans et le résultat est le même !

        Voici où j'en suis :

        function OuvreFic(P_Fichier)
        {
        	writeFile(G_FICLOG, "OuvreFic(" + P_Fichier + ")", "OUI");
        
        	alert("Ouverture du fichier : " + P_Fichier);
        	
        //	download_bis(P_Fichier, "il faut lire le fichier texte pour le charger");
        	
            $.ajax(
            {
                type: "POST",
                url: "./PHP/fileReader.php",
                data: {NomFichier : P_Fichier},
                async: false,
                error : function()
                {
        console.log("Echec de l'envoi de la requête -> fileReader.php : " + P_Fichier);			
                    alert("Echec de l'envoi de la requête -> fileReader.php : " + P_Fichier);
                },
                success: function(data)
                {
        console.log("OuvreFic - SUCCESS Donwload.php - "+P_Fichier);
        console.log("data="+data);
        			let WType = P_Fichier.substring(P_Fichier.length - 4, P_Fichier.length);
        			WType = WType.toUpperCase();
        console.log("WType="+WType);			
        // Le fichier est lu pour pouvoir en demander - ensuite - l'ouverture ou l'enregistrement.
        			if (WType == ".TXT" || WType == ".CSV")
        			{
        				download(P_Fichier, data);
        			}
        			else
        			{
        				if (WType == ".XLS" || WType == "XLSX")
        				{
        //			download_bis(P_Fichier, data, WType)
        //       saveAs(new Blob([data],{type:"application/vnd.ms-excel"}), P_Fichier);
        P_Fichier = "\\volume1\\web\\CTRL_BDD_MULTIVAC_SG\\tests\\2020_01_01_CDG.XLSX";					
        //P_Fichier = "CTRL_BDD_MULTIVAC_SG/tests/2020_01_01_CDG.XLSX";					
        console.log("P_Fichier="+P_Fichier);				
        //window.open(P_Fichier);
        	var blob = new Blob([data], {type: "application/vnd.ms-excel"});
        	saveAs(blob, P_Fichier);
        
        			
        				}
        				else
        				{
        					alert("Impossible de lire le fichier " + P_Fichier);
        				}
        			}
        		}
            });
        }
        
        function download(filename, text) {
        //// HTML5 -> Download	
        //    var pom = document.createElement('a');
        //    pom.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(text));
        //    pom.setAttribute('download', filename);
        //
        //    if (document.createEvent) {
        //        var event = document.createEvent('MouseEvents');
        //        event.initEvent('click', true, true);
        //        pom.dispatchEvent(event);
        //    }
        //    else {
        //        pom.click();
        //    }
        
         //HTML5 -> FileSaver.JS
        	var blob = new Blob([text], {type: "text/plain;charset=utf-8"});
        	saveAs(blob, filename);
        }
        
        <?php
        
        //echo(NomFichier);
        //
        //	$file = $_GET['NomFichier'];
        //
        ////	header('Content-Transfer-Encoding: binary');
        ////	header('Content-Disposition: attachment; filename="' . $file . '"'); //Nom du fichier
        //	header("Content-type: text/plain; charset=utf-8"); 
        //	header("Content-type: text/csv; charset=utf-8"); 
        //	header("Content-type: application/vnd.ms-excel");
        //
        //header("Content-Type: application/force-download");
        //header("Content-Type: application/octet-stream");
        //header("Content-Type: application/download");
        //header("Content-Disposition: attachment; filename=\"$file\"");
        //header("Pragma: public");
        //header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
        //
        //	//readfile('/volume1/web/CTRL_BDD_MULTIVAC_SG/LOG/2020_04_10_LOG_CTRL_BDD_MULTIVAC_SG.txt');// nom (et emplacement) du fichier dans le serveur
        //
        //	readfile($file);// nom (et emplacement) du fichier dans le serveur
        
        
        
        $file=$_POST['NomFichier'];
        
        header("Content-Type: application/force-download; name=\"" . $file . "\"");
        	header("Content-type: text/plain; charset=utf-8"); 
        charset=utf-8");
        
        header("Content-Disposition: attachment; filename=\"" . $file . "\"");
        header("Expires: 0");
        header("Cache-Control: no-cache, must-revalidate");
        header("Pragma: no-cache");
        readfile($file);
        	
        echo("file=" . $file);
        	
        ?>
        


        Toute la partie qui gère les TXT ou les CSV fonctionne : je suis obligé de lire le fichier pour le proposer ensuite à l'ouverture ou à l'enregistrement, c'est bizarre, mais c'est transparent pour l'utilisateur et ça fonctionne.

        Je reconnais que c'est pas propre, mais je n'arrive pas à faire autrement.

        Par contre, impossible de faire fonctionner la partie EXCEL.


        • Partager sur Facebook
        • Partager sur Twitter
          15 avril 2020 à 7:23:15

          Tu as essayé sans le MIME (qui est optionnel) pour le blob ?

          (Et fais un elseif, c'est pas beau ça ! Et une fonction download qui fonctionne pour tes 2 cas. Et pas un substring pour avoir l'extension mais plutot un explode avec le caractère "." et tu prends le dernier element du tableau. :p)

          • Partager sur Facebook
          • Partager sur Twitter
          Anonyme
            15 avril 2020 à 9:03:50

            Sinon un lien vers le fichier non..?
            • Partager sur Facebook
            • Partager sur Twitter
              15 avril 2020 à 15:00:11

              [Édit AbcAbc6 message afficher  et en attente d"edition par sont auteur]

              (Mince, j'ai oublié de mettre la balise pour le code et ça ne veux pas prendre en compte la modif, désolé)

              Merci de votre aide.

              J'ai essayé en suivant vos conseils, mais ça ne fonctionne pas mieux.

              Je tourne en rond, et malgré le confinement, ça va devenir short !

              Je ne m'attendais pas du tout à avoir ce genre de souci ;)

              J'ai vraiment besoin d'un coup de main de "doués", pas comme moi ;)

              J'ai essayé de faire "window.open(P_Fichier);" mais le souci c'est le chemin d'accès n'est pas pris en compte ou alors je merdouille quelque part.

              Dans P_Fichier, il y a par exemple "\volume1\web\CTRL_BDD_MULTIVAC_SG\tests\2020_01_01_CDG.XLSX"


              Sinon, autre piste :

              J'ai trouvé ça sur le net qui fait exactement ce que j'aimerai faire.

              J'ai un nom de fichier complet avec son chemin d'accès en entrée, mais je n'arrive pas à outrepasser le input file.

              Si on pouvait modifier cette fonction (voir le lien plus bas) pour qu'elle prenne le fichier en entrée, tout serait réglé (je crois).

              <input type="file" id="fileinput" />
              <p>
                <a id="download" download></a>
              </p>
              
              

              Je vous mets le lien du script https://codepen.io/dirgardare/details/bwVVom

              Je ne peux pas valider lorsque je l'ajoute dans le sujet, je ne sais pas pourquoi.

              Bref, j'espère que vous arriverez à me dépatouiller, je craque ;)




              -
              Edité par Zeb777Zeb777 15 avril 2020 à 17:42:53

              • Partager sur Facebook
              • Partager sur Twitter
                20 avril 2020 à 9:32:41

                La fonction semble au point et je la partage si ça peut aider.

                 
                async function downloadTest(filePath)
                {
                	let extension = filePath.substring(filePath.lastIndexOf('.'));
                	let mimetype = getMimetype(extension);
                 
                	let response = await fetch(filePath, {method: "POST"});
                	let data = await response.blob();
                	let metadata = {
                	type: mimetype
                	};
                 
                	let filename = filePath.substring(filePath.lastIndexOf('/') + 1);
                	console.log(filename);
                	let file = new File([data], filename, metadata);
                 
                	let dataURL = URL.createObjectURL(file);
                 
                 
                	switch (response.status)
                	{
                		case 200:
                			let a = document.createElement("a");
                			a.download = file.name;
                			a.href = dataURL;
                			document.body.appendChild(a);
                			a.click();
                			document.body.removeChild(a);
                			setTimeout(() => 
                			{
                				URL.revokeObjectURL(objectURL); // supprime l’objet "blob:" pour libérer la mémoire
                			}, 5*60*1000); // délai arbitraire de 5 min
                			writeFile(G_FICLOG, "TELECHARGEMENT : " + filePath + " - Status : " + response.status + " OK ", "OUI");
                			break;
                 
                		case 404:
                			alert("Le fichier que vous avez demandé n'existe pas, ou le chemin précisé est incorrect ( " + response.url + " ).");
                			console.warn(response);
                			writeFile(G_FICLOG, "TELECHARGEMENT : " + filePath + " - Status : " + response.status, "OUI");
                			break;
                 
                		case 405:
                			alert("Problème de droits d'accès.")
                			console.warn(response);
                			writeFile(G_FICLOG, "TELECHARGEMENT : " + filePath + " - Status : " + response.status, "OUI");
                			break;
                 
                		default:
                			alert("Erreur - status : " + response.status);
                			console.warn(response);
                			writeFile(G_FICLOG, "TELECHARGEMENT : " + filePath + " - Status : " + response.status, "OUI");
                			break;
                	}
                }

                La fonction getMimetype n'est pas de moi et peut être trouvée sur le net.

                Elle est très grande, mais je peux la partager ici si besoin.

                Merci à ceux qui ont pris le temps de m'aider.

                -
                Edité par Zeb777Zeb777 20 avril 2020 à 9:33:20

                • Partager sur Facebook
                • Partager sur Twitter
                  20 avril 2020 à 9:44:19

                  Salut !

                  J'ai l'impression que ta méthode getMimeType() ne sert pas à grand chose, parce que le client a tendance à déterminer lui-même le type avec son propre mécanisme…

                  • Partager sur Facebook
                  • Partager sur Twitter
                    21 avril 2020 à 18:31:18

                    En fait, elle ne sert que pour récupérer le status.
                    • Partager sur Facebook
                    • Partager sur Twitter

                    Faire un "Ouvrir avec..." ?

                    × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                    × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                    • Editeur
                    • Markdown