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

avec Java Discussion :

Connexion à un zip online renvoie une FileNotFoundException


Sujet :

avec Java

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 35
    Points : 18
    Points
    18
    Par défaut Connexion à un zip online renvoie une FileNotFoundException
    Bonsoir.

    Je code une appli pour télécharger automatiquement les sous-titre des séries que je regarde. Ceux-ci sont disponible sous forme de zip. J'arrive à me promener sur les pages du site pour récupérer le lien du zip, mais quand j'essaye de m'y connecter (que ce soit via url.openStream() ou urlConnection.getInputStream()) cette ligne me renvoie une FileNotFoundException.

    On pourrait croire que l'url est mauvaise mais je l'ai testée dans mon navigateur, elle lance bien le téléchargement du fichier...

    Quelqu'un aurait une idée pour résoudre mon problème ?
    D'avance merci.

  2. #2
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2011
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2011
    Messages : 22
    Points : 28
    Points
    28
    Par défaut
    T'a regardé s'il n'y avais pas des accents ou d'autres caractères spéciaux dans le lien et ou le nom du fichier. C'est peut-être la raison pour laquelle il ne trouve le fichier.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 35
    Points : 18
    Points
    18
    Par défaut
    Non il n'y a aucun caractère spécial, que des minuscules, majuscules, chiffres, espaces et underscores.

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2011
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2011
    Messages : 22
    Points : 28
    Points
    28
    Par défaut
    Citation Envoyé par limp57 Voir le message
    Non il n'y a aucun caractère spécial, que des minuscules, majuscules, chiffres, espaces et underscores.
    Les espaces au même titre.

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 35
    Points : 18
    Points
    18
    Par défaut
    J'ai essayé en utilisant URLEncoder pour virer les espaces, ça ne fonctionne quand même pas. Par contre il y a plusieurs points dans le lien (c'est les fameux noms de fichier qui finissent par quelque chose comme "HDTV.LOL.fr.zip").
    Le problème peut-il venir de ces points ?
    Si oui, il y a une façon de résoudre le problème ?

  6. #6
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2011
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2011
    Messages : 22
    Points : 28
    Points
    28
    Par défaut
    Non les points ne sont pas un problème. Le problème n'est apparemment pas dans le chemin.

    Tu pourrais mettre des extraits des sources de ton appli si ça te déranges pas pour avoir un peu plus de précisions.

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 35
    Points : 18
    Points
    18
    Par défaut
    Je pourrais poster du code mais la partie qui bug c'est vraiment rien qui puisse être faux...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    URL url = new URL(link);
    InputStream in = url.openStream();
    L'erreur est sur le openStream().

    Voilà l'erreur, qui sera certainement plus parlante que mon code :
    java.io.FileNotFoundException: http://www.tvsubtitles.net/files/How...DTV.LOL.fr.zip
    at sun.net.http://www.protocol.http.HttpURLConn...Stream(Unknown Source)
    at java.net.URL.openStream(Unknown Source)

    A savoir que le lien que je passe n'est pas directement celui-là, dans ce cas là c'est :
    http://www.tvsubtitles.net/download-182812.html

    Mais à priori Java fait la redirection tout seul, parce que si j'essaye directement de me connecter à "http://www.tvsubtitles.net/files/How I Met Your Mother_7x02_HDTV.LOL.fr.zip" j'ai exactement la même erreur.

    EDIT : désolé pour le lien dans le copié/collé de la console, c'est le site qui le crée et qui rajoute le http:// dès qu'il voit un www, j'ai essayé de le supprimer mais il le remet toujours...

  8. #8
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2011
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2011
    Messages : 22
    Points : 28
    Points
    28
    Par défaut
    Je pense que le problème est dans le nom du fichier, car il est rempli d'espace soit étonné et donc ton appli ne le retrouve pas et en appliquant urlEncoder() t'enleves les espaces dessus mais même problème vu que le nom n'est plus même il ne peut pas le trouver. Donc la seule solution que je vois c'est mettre des anti-slash devant chaque espace pour éviter qu'il ne soient interprétés(2eme solution changer le nom des fichiers)

  9. #9
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Marrant. Le redirect envoyé par le site est invalide (une URL ne doit pas contenir d'espace et c'est tout. Les navigateurs s'adaptent à ce qu'on leur dit, par courtoisie, et parce que la solution est évidente, mais une URL ne doit pas contenir d'espace.)
    Et Java suit bien la redirection par lui-même.

    Mais si on demande l'URL avec espace, le serveur ne comprend pas la requête (sauf si on le fait avec un navigateur, qui, par courtoisie, corrige l'URL erronée de la manière la plus évidente.)

    Si on lui demande l'URL en remplaçant les espaces par des +, ce que fait URLEncoder et devrait marcher, le serveur ne comprend pas non plus (ce qui est une erreur de sa part.)
    La seule chose qui marche c'est remplacer les espaces par des %20.

    Ce genre de choses seraient plus faciles à gérer avec la bibli Apache HttpClient, qu'avec la classe URL.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 35
    Points : 18
    Points
    18
    Par défaut
    Effectivement j'ai essayé en remplaçant les espaces par %20 ça marche. Merci beaucoup pour la solution.

    Je regarderai du côté de HttpClient mais à tout hasard il est possible d'obtenir le lien après la redirection ? Parce que là Java s'occupe tout seul de la redirection mais le lien réel du fichier je ne l'ai que grâce à l'exception qui est levée, je n'arrive pas à le trouver via du code, ce qui m'empêche de régler automatiquement ce souci de %20.
    Je ne pense pas que récupérer le lien dans le catch de l'exception est très propre

  11. #11
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,

    Citation Envoyé par thelvin Voir le message
    Si on lui demande l'URL en remplaçant les espaces par des +, ce que fait URLEncoder et devrait marcher, le serveur ne comprend pas non plus (ce qui est une erreur de sa part.)
    La seule chose qui marche c'est remplacer les espaces par des %20.
    Sauf erreur de ma part c'est normal. URLEncoder sert à encoder les paramètres de la requête, où les espaces sont remplacé par des +

    Dans le chemin les espaces doivent être remplacé par des %20, ainsi que d'autre caractères spéciaux. Le mieux reste à utiliser la classe URI pour nettoyer l'URL :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    	public static URL clean(URL u) throws MalformedURLException {
    		try {
    			URI uri = new URI(u.getProtocol(), u.getUserInfo(), 
    				u.getHost(), u.getPort(), u.getPath(), u.getQuery(), null);
    			return uri.toURL();
    		} catch (URISyntaxException e) {
    			MalformedURLException mue = new MalformedURLException(u.toString());
    			mue.initCause(e);
    			throw mue;
    		}
    	}
    Citation Envoyé par thelvin Voir le message
    Ce genre de choses seraient plus faciles à gérer avec la bibli Apache HttpClient, qu'avec la classe URL.
    La classe URL peut quand même faire l'affaire dans bien des cas

    Citation Envoyé par limp57 Voir le message
    il est possible d'obtenir le lien après la redirection ? Parce que là Java s'occupe tout seul de la redirection mais le lien réel du fichier je ne l'ai que grâce à l'exception qui est levée, je n'arrive pas à le trouver via du code, ce qui m'empêche de régler automatiquement ce souci de %20.
    Tu peux désactiver le suivi automatique des redirections pour le gérer toi même, en vérifiant le responseCode et le header "Location".

    Exemple simpliste :
    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
    	private static InputStream getInputStream(URL url, int maxRedirect) throws IOException {
    		HttpURLConnection con = (HttpURLConnection)url.openConnection();
    		con.setInstanceFollowRedirects(false);
    		con.connect();
     
    		switch(con.getResponseCode()) {
    		case HttpURLConnection.HTTP_MOVED_PERM:
    		case HttpURLConnection.HTTP_MOVED_TEMP:
    		case HttpURLConnection.HTTP_SEE_OTHER:
    			con.disconnect();
    			if (maxRedirect==0)
    				throw new IOException("Error Max Redirect");
    			String location = con.getHeaderField("Location");
     
    			URL newURL = clean(new URL(url, location));
    			return getInputStream(newURL, maxRedirect-1);
    		}
    		return con.getInputStream();
    	}

    a++

  12. #12
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Citation Envoyé par adiGuba Voir le message
    Sauf erreur de ma part c'est normal. URLEncoder sert à encoder les paramètres de la requête, où les espaces sont remplacé par des +

    Dans le chemin les espaces doivent être remplacé par des %20, ainsi que d'autre caractères spéciaux. Le mieux reste à utiliser la classe URI pour nettoyer l'URL :
    Tu te trompes pas, c'est moi qui suis allé trop vite.

    Citation Envoyé par adiGuba Voir le message
    La classe URL peut quand même faire l'affaire dans bien des cas


    Tu peux désactiver le suivi automatique des redirections pour le gérer toi même, en vérifiant le responseCode et le header "Location".
    Pas faux. L'exemple n'est finalement pas plus compliqué qu'avec HttpClient. Je sais pas, disons que je trouve sa JavaDoc mieux organisée pour trouver facilement quoi faire.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  13. #13
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par thelvin Voir le message
    Pas faux. L'exemple n'est finalement pas plus compliqué qu'avec HttpClient. Je sais pas, disons que je trouve sa JavaDoc mieux organisée pour trouver facilement quoi faire.
    C'est vrai que HttpClient est bien plus complet et plus souple.
    Mais URL et HttpURLConnection peuvent amplement suffire pour de nombreux besoins...


    a++

  14. #14
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 35
    Points : 18
    Points
    18
    Par défaut
    Merci à vous tous pour votre aide, et adiGuba ton code fonctionne très bien donc doublement merci.

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

Discussions similaires

  1. Renvoi à une procédure
    Par Bernjean dans le forum Access
    Réponses: 2
    Dernier message: 16/11/2005, 20h52
  2. [VCL] TImage.Create(AOwner) renvoie une Violation d'accès
    Par prgasp77 dans le forum Composants VCL
    Réponses: 10
    Dernier message: 23/01/2005, 17h14
  3. renvoie une valeur erronée
    Par m@thieu dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 09/12/2004, 17h09
  4. Réponses: 13
    Dernier message: 11/08/2004, 11h06
  5. probleme de connexion entre delphi 7 et une BD access
    Par bob.marley dans le forum Bases de données
    Réponses: 5
    Dernier message: 21/04/2004, 11h17

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