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

JavaScript Discussion :

Récupérer un fichier sur un service RestFull


Sujet :

JavaScript

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 29
    Points : 21
    Points
    21
    Par défaut Récupérer un fichier sur un service RestFull
    Bonjour,
    je vais essayer d'être clair pour vous exposer mon problème :p

    J'écris du code javascript et j'utilise une API sur laquelle je n'ai pas la main.
    Cette API nécessite d'être authentifier via un header Authorization dans la requête http. Je n'ai aucun problème à récupérer les informations au format json.
    Mon problème apparaît quand cette API me retourne un fichier binaire que j'aimerais pouvoir télécharger depuis le navigateur.
    Je récupère bien le fichier coté javascript (avec un appel xhr) mais je ne sais pas quoi en faire. D’après mes recherches je peux d'ailleurs plus en faire grand chose.
    Si j'utilise un href='www.api.whatever.com/file/get/12' je n'ai pas le sentiment de pouvoir transmettre l'authentification.

    Des idées ?

    Merci de m'avoir lu

  2. #2
    Expert éminent
    Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    Juin 2010
    Messages
    3 094
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 094
    Points : 6 755
    Points
    6 755
    Par défaut
    Si si, c'est possible de traiter du binaire avec Ajax : https://developer.mozilla.org/en-US/...ng_Binary_Data

    C'est en anglais mais je peux te faire un semblant de traduction si tu le demandes

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 29
    Points : 21
    Points
    21
    Par défaut
    C'est très bien en anglais, merci. Je teste au plus vite

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 29
    Points : 21
    Points
    21
    Par défaut
    Alors l'API ne fonctionne pas pour le moment, et pour simplifier le problème au maximum, j'ai placé un fichier pdf sur mon Apache.

    Voila mon cas de test :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    $scope.getFile = function(id){
      $http({
        method: 'GET',
        url:'/test.pdf',
        responseType:'blob'
    }).success(function(data,status,headers,config){
      var blob=new Blob([data],{type:'application/pdf'});
      var url=URL.createObjectURL(blob);
      $('#test').href=url;
    }
    }
    C'est de l'AngularJS, mais cela ne devrait pas être un problème. Il m'est impossible d'ouvrir le fichier ainsi créé.

  5. #5
    Expert éminent
    Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    Juin 2010
    Messages
    3 094
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 094
    Points : 6 755
    Points
    6 755
    Par défaut
    Si j'ai bien compris, ton bout de code appelle le fichier, le convertit en une URI data: (createObjectURL) et attache cette URI à un lien, c'est bien ça ? Qu'est-ce qui ne marche pas ?

    Est-tu sûr que ton navigateur de test supporte le type 'blob' ? As-tu essayé la méthode du charset 'x-user-defined' ?

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 29
    Points : 21
    Points
    21
    Par défaut
    Alors mon navigateur est chrome 29. Je pense qu'il gére ca. Je n'ai pas d'erreur JS.
    Ce qui ne marche pas, c'est quand je clique sur le lien que j'ai ainsi généré :
    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    <a href="blob:http%3A//localhost/4ce88f5e-4634-4860-93cc-7771a3048e0c" id="test">Test</a>
    Chrome est incapable d'ouvrir le fichier pdf.

    As-tu essayé la méthode du charset 'x-user-defined' ?
    Je vais chercher des infos, et tester ça.

    Merci

  7. #7
    Expert éminent
    Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    Juin 2010
    Messages
    3 094
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 094
    Points : 6 755
    Points
    6 755
    Par défaut
    C'est la première fois que je vois une blob: URI.
    Si j'en crois la doc ton url devrait être "blob:4ce88f5e-4634-4860-93cc-7771a3048e0c". Il y a peut-être un problème de type de lien (relatif / absolu). J'ai déjà eu des problèmes en modifiant directement des href et je les ai résolus en utilisant setAttribute.

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 29
    Points : 21
    Points
    21
    Par défaut
    Alors, j'ai modifier à la main avec le Developer Tools de chrome le lien pour mettre :
    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    <a href="blob:4ce88f5e-4634-4860-93cc-7771a3048e0c" id="test">Test</a>
    Quand je clique sur le lien j'ai cette fois une erreur dans la console JS :
    Not allowed to load local resource: blob:4ce88f5e-4634-4860-93cc-7771a3048e0c
    [EDIT] Ce qui me fait penser qu'il est compliqué (pas possible) de demander au client de télécharger un fichier générer/reçu en JS

  9. #9
    Expert éminent
    Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    Juin 2010
    Messages
    3 094
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 094
    Points : 6 755
    Points
    6 755
    Par défaut
    Je pense que c'est plutôt parce que le blob n'existe plus. Il dépend du contexte de la page et son adresse change à chaque fois.

    Réessaye comme tout à l'heure mais avec un url.replace("http%3A//localhost/", "") et ça devrait donner quelque chose

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 29
    Points : 21
    Points
    21
    Par défaut
    Pas mieux. Si j'en crois le message d'erreur, il est plutôt question de droit que contexte ou de chemin d’accès (une fois le bon format utilisé).
    Not allowed to load local resource: blob:0b14fae3-01ce-467b-9b9c-a42ef56e0ba7

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 29
    Points : 21
    Points
    21
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    $scope.getFile = function(id){
    	var xhr = new XMLHttpRequest();
    	xhr.responseType = 'blob';		
    	xhr.open('GET', /url/to/file/'+id, true);
    	xhr.setRequestHeader('Authorization', 'myToken');
    	xhr.onload = function(e) {
    		window.location=window.URL.createObjectURL(this.response);
    	};
    	xhr.send();
    };
    Tu avais raison visiblement, ça marche comme ça. Je vérifierais le $http de AngularJS ne prend peut être pas en charge les blob.

    Finalement pas besoin de changer l'url ainsi formé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    blob:http%3A//localhost/a97bf104-4955-4a30-b8a3-1ee7b7a0ab0f
    J'utilise chrome. Il est probable que chaque navigateur est son propre nommage des URL (local ? en cache? je ne sais pas bien à quoi correspond cette url, enfin je sais surtout pas où est stocké le binaire à télécharger).

    Par contre le fichier que je telecharge a finalement un nom assez moche a97bf104-4955-4a30-b8a3-1ee7b7a0ab0f.pdf, sais tu si je peux le définir ?

    En tout cas, merci de ton aide

Discussions similaires

  1. Réponses: 1
    Dernier message: 24/01/2008, 11h05
  2. Récupérer un fichier sur un serveur HTTP
    Par Medivh dans le forum WinDev
    Réponses: 2
    Dernier message: 01/04/2007, 22h28
  3. récupérer un fichier sur un serveur distant
    Par Phiss dans le forum ASP
    Réponses: 7
    Dernier message: 17/05/2006, 18h02
  4. récupérer un fichier sur Intranet
    Par nbelg27 dans le forum Access
    Réponses: 5
    Dernier message: 10/11/2005, 13h58
  5. [WebLogic] Récupérer un fichier sur le serveur...
    Par T.NightGlow dans le forum Weblogic
    Réponses: 1
    Dernier message: 29/06/2005, 15h32

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