11496 sujets

JavaScript, DOM et API Web HTML5

Bonjour à tous,

J'ai créer une fonction "telecharger" qui permet de downloader n'importe quel fichier.

function telecharger(filename){
        var url = "documents/telecharger?filename="+filename;
        $.ajax({
            type: "GET",
            url: url,
            success: function(data){
                if(data === true){
                    console.log('This file is not available for download.');
                }else{
                    window.location =""+url+"";
                }
            }         
        });        
    }


Je peux sélectionner plusieurs fichiers à télécharger à l'aide de case à cocher. Puis lorsque je clique sur le bouton "télécharger" mon script boucle sur les cases et appel la fonction pour chaque fichier.

$('#menu_file #telecharger').click(function(){
        $('#list_files .file input:checked').each(function(){          
            telecharger($(this).val());
        });
    });


Il télécharge correctement le premier fichier pour pas les suivants. Je vois cependant dans le journal du navigateur qui fait correctement ces requêtes ajax mais ne fait pas le window.location.

Si je test un à les fichiers il se télécharge tous. Si je les fait en boucle seulement le premier de la liste. Une idée ? Merci à tous
Modifié par mini-truc (13 Mar 2014 - 13:41)
salut,
au pif et sans avoir vraiment lu, je dirais que c'est parce qu'une fois que "window.location" se fait, le reste se perd ?
a écrit :
au pif et sans avoir vraiment lu, je dirais que c'est parce qu'une fois que "window.location" se fait, le reste se perd ?

+1. window.location fait changer de page, tous les scripts s'arrêtent !
Tu peux peut-être essayer avec window.open ou une iframe de 1x1, mais ça reste une solution bricolage.

De toute façon dans la plupart des cas, à mon avis, tu ne peux pas lancer plusieurs téléchargements à la suite sans intervention de l'utilisateur; il doit au moins accepter.... sauf en présence d'un plugin qui remplacerait ou améliorerait le gestionnaire de téléchargements de base.
Merci à vous deux ; en effet j'ai tenté d'utilisé open mais cela ne télécharge rien du tout.

Concernant les demandes utilisateurs ; cela ne me dérange pas du tout mais qu'il ouvre consécutivement les x demandes de ddl.

Je vais regarder l'histoire des iframes Smiley ohwell
Voici la solution que j'ai mise en place pour le moment :

var count = 0;

function telecharger(filename){
        var url = "documents/telecharger?filename="+filename;
        $.ajax({
            type: "GET",
            url: url,
            success: function(data){
                if(data === true){
                    console.log('This file is not available for download.');
                }else{
                    $('#loading').hide();
                    //window.location =""+url+"";
                    var hiddenIFrameID = 'hiddenDownloader' + count++;
                    var iframe = document.createElement('iframe');
                    iframe.id = hiddenIFrameID;
                    iframe.style.display = 'none';
                    document.body.appendChild(iframe);
                    iframe.src = url;
                }
            }         
        });        
    }


Le premier fichier se télécharge directement et le second demande une autorisation. merci pour l'idée !
Par contre j'éviterais le display:none sur l'iframe. Je pense notamment à IE qui aurait tendance à ne même pas essayer de charger le fichier s'il sait d'avance qu'il ne doit pas être affiché (ça s'est déjà vu avec des PDF, des applets ou des objets flash). Vaut mieux le masquer par un procédé plus « subtil » (l'envoyer hors de la zone d'affichage avec du text-indent ou du position:absolute/top/left par exemple).
OK je vais testé cela sous IE ... Merci du conseil Smiley cligne

Edit : je viens de tester avec IE11 ; je n'ai aucun problème avec le iframe en display none ; j'ai testé sur des fichiers de type (.pdf, .png, .css et .php).

Mais je garde ton idée dans un coin si jamais je tombe sur ce souci Smiley smile !
Modifié par mini-truc (13 Mar 2014 - 13:45)
Bonjour,

Une solution plus propre serais de générer un zip, et de l'envoyer au navigateur Smiley smile

Je dit ca pour la V2 Smiley smile