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

API standards et tierces Java Discussion :

Ne pas afficher le navigateur lors de telechargement


Sujet :

API standards et tierces Java

  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2018
    Messages
    150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2018
    Messages : 150
    Points : 45
    Points
    45
    Par défaut Ne pas afficher le navigateur lors de telechargement
    Bonsoir a tous,

    en gros tout est dans le titre.
    $je désire savoir comment je pourrais ne pas afficher la fenêtre du navigateur lorsqu'en cliquant sur mon bouton OK de mon app, je lance une succession de téléchargement de fichier depuis une URL.
    j'ai essayé avec this.setVisible(false); mais ca ne marche pas.

    merci par avance pour votre aide.

  2. #2
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Salut,

    Il faudrait nous préciser quel type d'application et en particulier d'UI (Swing, JavaFX, console, autre...). Ou nous montrer du code aussi pour voir comment tu procèdes à ce téléchargement via URL. Normalement, les techniques courantes (URL.openStream, ou en passant par HttpClient par exemple) n'affichent aucun navigateur parce qu'elles ne passent pas par un navigateur.

  3. #3
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2018
    Messages
    150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2018
    Messages : 150
    Points : 45
    Points
    45
    Par défaut
    bonjour joel,

    je travaille sur Mac, et google mon navigateur.

    voici le bout de code ci dessous:

    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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
     
    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
     
     
                          try {
     
                                      String SV;
                       SV = jComboBox1.getSelectedItem().toString();
                       String leftlon; String rightlon; String toplat; String bottomlat;
                       leftlon = jTextField1.getText();
                       rightlon = jTextField2.getText();
                       toplat = jTextField3.getText();
                       bottomlat = jTextField4.getText();
     
                LocalDate localdate;
            localdate = LocalDate.now();
                    String d = localdate.format(DateTimeFormatter.BASIC_ISO_DATE);
                       String URL1;  String URL1B;                                       
                       String URL3;  String URL3B; String URL3D; String URL3F; String URL3H; 
                       String URL4;
     
                                URL1 = "https://nomads.ncep.noaa.gov/cgi-bin/filter_gfs_0p50.pl?file=gfs.t";                               
                                    URL1B = "z.pgrb2full.0p50.";
                                        URL3 = "&lev_1000_mb=on&lev_250_mb=on&lev_300_mb=on&lev_400_mb=on&lev_500_mb=on&lev_700_mb=on&lev_750_mb=on&lev_850_mb=on&var_TMP=on&var_UGRD=on&var_VGRD=on&subregion=&leftlon=";
                                            URL3B = "&rightlon=";
                                                URL3D = "&toplat=";
                                                    URL3F = "&bottomlat=";                                                                  
                                                        URL3H ="&dir=%2Fgfs.";  
                                                            URL4 = "%2F";                      
     
                           for(int i = 0; i <= 10; i+=3)
    java.awt.Desktop.getDesktop().browse(java.net.URI.create(URL1+ SV +URL1B+"f00"+ i+URL3 +leftlon +URL3B +rightlon +URL3D+ toplat +URL3F +bottomlat +URL3H +d +URL4 +SV));
     
     
            String hr; 
         hr = jComboBox2.getSelectedItem().toString();
          int result;
     
                              result = Integer.parseInt(hr);
                                  for(int i =12 ;i <= 102; i+=3)
                                      if ((result>=12) && (i<=100) && (i<=result)) {
                              java.awt.Desktop.getDesktop().browse(java.net.URI.create(URL1+ SV+URL1B+"f0"+ i+URL3 +leftlon +URL3B +rightlon +URL3D+ toplat +URL3F +bottomlat +URL3H +d +URL4 +SV));
     
         }
                              if (result >102) {
                                        for (int i =102 ; i <= result; i+=3)
                              java.awt.Desktop.getDesktop().browse(java.net.URI.create(URL1+ SV +URL1B+"f"+ i+URL3 +leftlon +URL3B +rightlon +URL3D+ toplat +URL3F +bottomlat +URL3H +d +URL4 +SV));
     
                          }
     
    dispose();
     
     
                 } catch (IOException | NumberFormatException e) {
                       JOptionPane.showMessageDialog(null,e.getMessage());
     
                  }
     
        }

  4. #4
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    C'est du Swing déjà.

    java.awt.Desktop.getDesktop().browse() est une commande qui sert à lancer un navigateur, donc forcément ça ouvre un navigateur, celui par défaut de la plateforme ! Ce n'est pas fait pour faire du téléchargement. Et si ça télécharge, c'est juste si l'URL pointe vers une ressource qui dispose d'un Content-Disposition avec attachement, sinon ça s'affiche dans le navigateur, selon les modalités du navigateur, ce qui peut être fastidieux pour l'utilisateur.

    Pour télécharger une ressource via une URL, en version simple (ça charge directement le body dans le système de fichier (ici dans l'exemple l'image du logo DVP) :
    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
    20
    21
    22
    public class DownloadFromURL {
     
    	public static void downloadFromURL(URL url, Path target, CopyOption...options) throws IOException {
    		try(InputStream inputStream = new BufferedInputStream(url.openStream())) {
    			Files.copy(inputStream, target, options);
    		}
    	}
     
    	public static void main(String[] args) {
    		String url = "https://www.developpez.com/template/images/logo-dvp-h55.png";
    		String target = "logo-dvp.png";
     
    		try {
    			downloadFromURL(URI.create(url).toURL(), Paths.get(target), StandardCopyOption.REPLACE_EXISTING);
    			System.out.println("Fichier téléchargé : " + Paths.get(target).toAbsolutePath());
    		} catch (IOException e) {
    			e.printStackTrace();
    		}
     
    	}
     
    }
    Pour télécharger en tenant compte des attachements :
    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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    public static void downloadFromURL(URL url, Path targetDirectory, Path defaultTarget) throws IOException {
     
    		if ( !Files.isDirectory(targetDirectory) ) {
    			throw new IOException("Path is not directory");
    		}
     
    		HttpURLConnection conn = (HttpURLConnection)url.openConnection();
            int responseCode = conn.getResponseCode();
     
            // always check HTTP response code first
            if (responseCode == HttpURLConnection.HTTP_OK || responseCode == HttpURLConnection.HTTP_CREATED) {
                String contentDisposition = conn.getHeaderField("Content-Disposition");
                Path targetFile;
                if ( contentDisposition==null ) {
                	if ( defaultTarget==null ) {
                		throw new IOException("No Content-Dispostion");
                	}
                    targetFile = targetDirectory.resolve(defaultTarget);
                }
                else {
    	            int index = contentDisposition.indexOf("filename=");
    	            if (index > 0) {
    	                String fileName = contentDisposition.substring(index + 10,
    	                        contentDisposition.length() - 1);
    	                targetFile = targetDirectory.resolve(Paths.get(fileName));
    	            }
    	            else {
    	            	if ( defaultTarget==null ) {
    	            		throw new IOException("No file name");
    	            	}
    	                targetFile = targetDirectory.resolve(defaultTarget);
    	            }
                }
     
                if ( Files.exists(targetFile) ) {
                	String filename = targetFile.getFileName().toString();
                	int start;
                	StringBuilder newfilename;
                	int extensionPosition = filename.indexOf('.');
                	if ( extensionPosition<0 ) {
                		newfilename = new StringBuilder(filename).append(" (");
                		start = newfilename.length();
                		newfilename.append(')');
                	}
                	else {
                		newfilename = new StringBuilder(filename.substring(0,extensionPosition)).append(" (");
                		start = newfilename.length();
                		newfilename.append(')');
                		newfilename.append(filename.substring(extensionPosition));
                	}
     
     
                	for(int count=1, end=start; Files.exists(targetFile); count++ ) {
     
                		String str = String.valueOf(count);
                		newfilename.replace(start, end, str);
                		end = start+str.length();
    	            	targetFile = targetDirectory.resolve(Paths.get(newfilename.toString()));
     
    	            }
                }
     
        		try(InputStream inputStream = new BufferedInputStream(conn.getInputStream())) {
        			Files.copy(inputStream, targetFile);
        		}
     
            }
            else {
            	throw new IOException("Error HTTP status: "+responseCode + " / " + getHttpStatusErrorName(responseCode));
            }
     
    	}
     
    	private static String getHttpStatusErrorName(int responseCode) {
     
    		return Arrays.stream(HttpURLConnection.class.getFields())
    		      .filter(field-> field.getName().startsWith("HTTP_"))
                          .filter(field-> field.getType()==int.class)
    		      .filter(field-> {
    		    	  try {
    					return field.get(null).equals(responseCode) ;
    				} catch (Throwable e) {
    					return false;
    				} 
    		      })
    		      .map(field-> field.getName().substring("HTTP_".length()))
    		      .findFirst().orElse("UNKNOWN");
     
    	}
    Tout ceci ne fonctionne pas avec une connexion sécurisée, ou si le site fait des trucs spéciaux en JavaScript pour le téléchargement, ou encore si le contenu est compressé, etc. Si la connexion accepte un header Authorization ou autre, on peut gérer ce header (et l'affecter par HttpUrlConnection.setRequestProperty()). On peut utiliser JSoup ou HttpClient, ou autre (on trouve des API Java qui appelle curl par exemple).

    Enfin, tu peux utiliser un navigateur intégré JavaFX (WebView) et le piloter en Java, et donc avoir le contrôle complet.

    Si tu tiens à passer par un navigateur externe, et que le téléchargement est possible sans la fenêtre, il te faudra utiliser une bibliothèque capable de s'interfacer avec le système, trouver la fenêtre qui correspond au navigateur, pour la cacher (et la fermer au bon moment), ce qui risque d'être assez complexe dans l'ensemble.

  5. #5
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2018
    Messages
    150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2018
    Messages : 150
    Points : 45
    Points
    45
    Par défaut
    merci pour cette réponse Joel.
    ton premier code semble me correspondre ( du moins j'ai pu l'adapter a mon projet, au code que j'ai partagé)
    une petite question cependant.
    il enregistre le fichier chargé dans le chemin du projet.
    est-ce dû a l'option "StandardCopyOption.REPLACE_EXISTING"
    car en soit si je pouvais definir un autre chemin pour le mettre dans un autre dossier...

  6. #6
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par K2carca Voir le message
    une petite question cependant.
    il enregistre le fichier chargé dans le chemin du projet.
    est-ce dû a l'option "StandardCopyOption.REPLACE_EXISTING"
    Non, c'est dû à String target = "logo-dvp.png"; dans mon exemple. Comme il n'y a pas de dossier, c'est le dossier de travail qui est utilisé et le dossier de travail lorsqu'on exécute depuis un IDE, c'est le dossier de projet. Si tu veux indiquer un dossier, tu le fais directement dans la variable target ;

    Par exemple, sous Windows, pour télécharger dans le dossier Téléchargements de l'utilisateur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    String target = System.getProperty("user.home")+"/Downloads/logo-dvp.png";
    StandardCopyOption.REPLACE_EXISTING c'est une option qui dit que si le fichier existe déjà, il est remplacé. Sans cette option, si le fichier existe déjà, il y aura une exception.

  7. #7
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2018
    Messages
    150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2018
    Messages : 150
    Points : 45
    Points
    45
    Par défaut
    d'accord, je vois. et par contre si en principe le téléchargement en question m'importe plusieurs fichiers et que la il m'en importe qu'un ? c'est normal ?

    je veux dire par la que je n'obtiens pas le même resultats avec ce code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    java.awt.Desktop.getDesktop().browse(java.net.URI.create(URL1+ SV +URL1B+"f00"+ i+URL3 +leftlon +URL3B +rightlon +URL3D+ toplat +URL3F +bottomlat +URL3H +d +URL4 +SV));
    et celui la (que j'ai adapté donc)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
      downloadFromURL(URI.create(URL1+ SV +URL1B+"f00"+ i+URL3 +leftlon +URL3B +rightlon +URL3D+ toplat +URL3F +bottomlat +URL3H +d +URL4 +SV).toURL(), Paths.get(target), StandardCopyOption.REPLACE_EXISTING);

  8. #8
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    ça dépend de ce que pointe l'URL. Si elle pointe sur une ressource téléchargeable, ça la télécharge, si ça pointe sur autre chose, que le navigateur interprète pour télécharger plusieurs fichiers, tu ne peux pas utiliser ce système (comme je te l'ai écrit). Donne moi l'url complète (et pas cette usine à gaz de concaténation de plein de trucs que je ne connais pas), et je peux regarder de quoi il s'agit et vers quelle solution t'orienter.

  9. #9
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2018
    Messages
    150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2018
    Messages : 150
    Points : 45
    Points
    45
    Par défaut
    voici l'URL, en fait au travers d'une fenêtre de mon app(elle defini la date du fichier en gras) , l'utilisateur défini la version (le deuxieme gras de lurl) mais aussi il defini la zone géographique et les "altitudes pressions" (optionnel)
    https://nomads.ncep.noaa.gov/pub/dat...m/gfs/prod/gfs.20191215/00/

    par contre le fichier est spécifique. J'entends par la que comme tu pourras constater il y a un fichier chaque 3h et dans des formats different. jusque a la 395eme heure. autant de combinaison

    avec mon code "initial" j'arrive a importer directement dans "telechargement" de mon ordi sauf que la fenetre du navigateur s'affiche.
    en adaptant ton code au mien je ne telecharge qu'un fichier. qui ne porte pas le même nom. et malgre ta derniere indication je n'arrive pas a lui determiner le chemin target que je veux( sous mac)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    System.getProperty("Users/moi/Desktop/")+ "grib du "+ d;
    ne marche pas. (d = la date du systeme soit aujourdhui 20191215)

  10. #10
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par K2carca Voir le message
    voici l'URL, en fait au travers d'une fenêtre de mon app(elle defini la date du fichier en gras) , l'utilisateur défini la version (le deuxieme gras de lurl) mais aussi il defini la zone géographique et les "altitudes pressions" (optionnel)
    https://nomads.ncep.noaa.gov/pub/dat...m/gfs/prod/gfs.20191215/00/

    par contre le fichier est spécifique. J'entends par la que comme tu pourras constater il y a un fichier chaque 3h et dans des formats different. jusque a la 395eme heure. autant de combinaison
    Bah donne moi un exemple ou la formule pour l'obtenir, parce qu'avec l'URL ci-dessus, je ne peux rien faire, vu qu'elle renvoie une 404.

    Citation Envoyé par K2carca Voir le message
    avec mon code "initial" j'arrive a importer directement dans "telechargement" de mon ordi sauf que la fenetre du navigateur s'affiche.
    Peut-être est-ce un lien avec Content-Disposition ?
    Ce que tu peux faire aussi c'est m'afficher le résultat de cette méthode appliquée à une ou plusieurs de tes URL :
    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
    20
    21
    22
    23
    24
    25
    public static void printHeadersFromURL(URL url) throws IOException {
    		URLConnection conn = url.openConnection();
    		TreeMap<String,List<String>> map = new TreeMap<>(Comparator.nullsFirst(Comparator.naturalOrder()));
    		map.putAll(conn.getHeaderFields());
    		for(Map.Entry<String,List<String>> headers : map.entrySet()) {
    			if ( headers.getKey()==null ) {
    				System.out.println(headers.getValue().stream().collect(Collectors.joining(" ")));
    			}
    			else {
    				switch(headers.getValue().size()) {
    				case 0:
    					System.out.println(headers.getKey()+":");
    					break;
    				case 1:
    					System.out.println(headers.getKey() + ": " + headers.getValue().iterator().next());
    					break;
    				default:
    					System.out.println(headers.getKey() + ": ");
    					for(String value : headers.getValue()) {
    						System.out.println("    " + value);
    					}
    				}
    			}
    		}
    	}
    L'utiliser comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    	try {
    			printHeadersFromURL(URI.create(url).toURL());
    		} catch (IOException e) {
    			e.printStackTrace();
    		}
    Les headers c'est déjà un bon commencement pour évaluer ce qu'il y a dans le retour d'une invocation d'URL.

    Citation Envoyé par K2carca Voir le message
    en adaptant ton code au mien je ne telecharge qu'un fichier. qui ne porte pas le même nom. et malgre ta derniere indication je n'arrive pas a lui determiner le chemin target que je veux( sous mac)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    System.getProperty("Users/moi/Desktop/")+ "grib du "+ d;
    ne marche pas. (d = la date du systeme soit aujourdhui 20191215)
    Le paramètre de getProperty() c'est un nom de propriété. La propriété pour avoir le dossier de l'utilisateur, c'est user.home, comme dans mon exemple.
    Tu peux mettre le nom du dossier un dur si tu veux, mais sans le System.getProperty() alors (et mets un chemin absolu, sinon tu seras dans le même cas que mon premier exemple : dans un sous-dossier du dossier de travail.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    String target = "/Users/moi/Desktop/"+ "grib du "+ d;
    Je précise aussi que le dossier doit exister.

  11. #11
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2018
    Messages
    150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2018
    Messages : 150
    Points : 45
    Points
    45

  12. #12
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Si tu utilises mon dernier code pour obtenir les headers tu verras que la réponse et avec attachement et qu'il n'y qu'un seul fichier.

    HTTP/1.1 200 OK
    Cache-Control: max-age=14400
    Connection: Keep-Alive
    Content-Description: grib2 file
    Content-Disposition: attachment; filename="gfs.t00z.pgrb2full.0p50.f000"
    Content-Transfer-Encoding: binary
    Content-Type: application/octet-stream
    Date: Sun, 15 Dec 2019 17:32:09 GMT
    Expires: Sun, 15 Dec 2019 21:32:09 GMT
    Keep-Alive: timeout=300, max=100
    Server: Apache
    Strict-Transport-Security: max-age=31536000; includeSubdomains; preload
    Transfer-Encoding: chunked
    Via: 1.1 nomads.ncep.noaa.gov-80
    X-Content-Type-Options: 
        nosniff
        nosniff
    X-Frame-Options: 
        SAMEORIGIN
        SAMEORIGIN
    X-XSS-Protection: 
        1; mode=block
        1; mode=block
    
    Et si j'utilise l'exemple que je t'ai mis pour les cas avec attachement (ci-dessous, je remets le code avec des petits changements, en particulier pour récupérer le nom du fichier téléchargé), je charge bien le fichier.
    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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    public class DownloadFromURL {
     
    	public static Path downloadFromURL(URL url, Path targetDirectory, Path defaultTarget) throws IOException {
     
    		if ( !Files.isDirectory(targetDirectory) ) {
    			throw new IOException("Path is not directory");
    		}
     
    		HttpURLConnection conn = (HttpURLConnection)url.openConnection();
            int responseCode = conn.getResponseCode();
     
            // always check HTTP response code first
            if (responseCode == HttpURLConnection.HTTP_OK || responseCode == HttpURLConnection.HTTP_CREATED) {
                String contentDisposition = conn.getHeaderField("Content-Disposition");
                Path targetFile;
                if ( contentDisposition==null || !contentDisposition.startsWith("attachment;") ) {
                	if ( defaultTarget==null ) {
                		throw new IOException("No Content-Dispostion");
                	}
                    targetFile = targetDirectory.resolve(defaultTarget);
                }
                else {
    	            int index = contentDisposition.indexOf("filename=");
    	            if (index > 0) {
    	                String fileName = contentDisposition.substring(index + 10,
    	                        contentDisposition.length() - 1);
    	                targetFile = targetDirectory.resolve(Paths.get(fileName));
    	            }
    	            else {
    	            	if ( defaultTarget==null ) {
    	            		throw new IOException("No file name");
    	            	}
    	                targetFile = targetDirectory.resolve(defaultTarget);
    	            }
                }
     
                if ( Files.exists(targetFile) ) {
                	String filename = targetFile.getFileName().toString();
                	int start;
                	StringBuilder newfilename;
                	int extensionPosition = filename.indexOf('.');
                	if ( extensionPosition<0 ) {
                		newfilename = new StringBuilder(filename).append(" (");
                		start = newfilename.length();
                		newfilename.append(')');
                	}
                	else {
                		newfilename = new StringBuilder(filename.substring(0,extensionPosition)).append(" (");
                		start = newfilename.length();
                		newfilename.append(')');
                		newfilename.append(filename.substring(extensionPosition));
                	}
     
     
                	for(int count=1, end=start; Files.exists(targetFile); count++ ) {
     
                		String str = String.valueOf(count);
                		newfilename.replace(start, end, str);
                		end = start+str.length();
    	            	targetFile = targetDirectory.resolve(Paths.get(newfilename.toString()));
     
    	            }
                }
     
        		try(InputStream inputStream = new BufferedInputStream(conn.getInputStream())) {
        			Files.copy(inputStream, targetFile);
        		}
        		return targetFile;
     
            }
            else {
            	throw new IOException("Error HTTP status: "+responseCode + " / " + getHttpStatusErrorName(responseCode));
            }
     
    	}
     
    	private static String getHttpStatusErrorName(int responseCode) {
     
    		return Arrays.stream(HttpURLConnection.class.getFields())
    		      .filter(field-> field.getName().startsWith("HTTP_"))
    		      .filter(field-> field.getType()==Integer.class)
    		      .filter(field-> {
    		    	  try {
    					return field.get(null).equals(responseCode) ;
    				} catch (Throwable e) {
    					return false;
    				} 
    		      })
    		      .map(field-> field.getName().substring("HTTP_".length()))
    		      .findFirst().orElse("UNKNOWN");
     
    	}
     
    	public static void main(String[] args) {
    		String url = "https://nomads.ncep.noaa.gov/cgi-bin/filter_gfs_0p50.pl?file=gfs.t00z.pgrb2full.0p50.f000&lev_1000_mb=on&lev_200_mb=on&lev_300_mb=on&lev_400_mb=on&lev_500_mb=on&lev_700_mb=on&lev_800_mb=on&lev_850_mb=on&lev_875_mb=on&var_TMP=on&var_UGRD=on&var_VGRD=on&leftlon=0&rightlon=360&toplat=90&bottomlat=-90&dir=%2Fgfs.20191215%2F00";
    		String target = "";
    		String defaultTarget = "default.bin";
     
     
     
    		try {
    			Path path = downloadFromURL(URI.create(url).toURL(), Paths.get(target), Paths.get(defaultTarget));
    			System.out.println("Fichier téléchargé : " + path.toAbsolutePath());
    		} catch (IOException e) {
    			e.printStackTrace();
    		}
     
    	}
     
    }

  13. #13
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2018
    Messages
    150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2018
    Messages : 150
    Points : 45
    Points
    45
    Par défaut
    ok donc j'en conclu que je dois faire une boucle afin de telecharger les fichiers necessaires que souhaiterait l'utilisateurs?

  14. #14
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par K2carca Voir le message
    ok donc j'en conclu que je dois faire une boucle afin de telecharger les fichiers necessaires que souhaiterait l'utilisateurs?
    Oui, il faut appeler la méthode de téléchargement pour chaque URL. C'est d'ailleurs déjà ce que tu faisais quand tu appelais Desktop::browse.

  15. #15
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2018
    Messages
    150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2018
    Messages : 150
    Points : 45
    Points
    45
    Par défaut
    oui c'est ce que je faisais avant mais le navigateur s'affichait a chaque fois.

    même en adaptant ton premier code il ne m'en charge qu'un ... je vais voir ca merci en tout cas

  16. #16
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Tu changes bien le fichier de destination à chaque fois ? Sinon forcément, tous les chargements écrasent le précédent. Avec la méthode de téléchargement qui tient compte du content-disposition, j'ai fait que les fichiers de même nom n'écrasent pas le précédent fichier s'il existe, mais le nom contient (n) avec n qui s'incrémente.

  17. #17
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2018
    Messages
    150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2018
    Messages : 150
    Points : 45
    Points
    45
    Par défaut
    non, initialement, tout les fichiers importé allaient dans "download" directectement

  18. #18
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Je ne parlais pas de ce qui se passait dans le navigateur. Je te parle de l'emploi de la méthode que j'ai écrite : public static void downloadFromURL(URL url, Path target, CopyOption...options) throws IOException {.

    target c'est le chemin du fichier de destination. Si tu appelles cette méthode pour différentes URL avec le même target, tous les téléchargments sont vers le même fichier, donc tu n'as qu'un fichier à la fin.

  19. #19
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2018
    Messages
    150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2018
    Messages : 150
    Points : 45
    Points
    45
    Par défaut
    voici les fichiers que je telecharge avec mon code

    gfs.t00z.pgrb2full.0p50.f000
    gfs.t00z.pgrb2full.0p50.f003
    gfs.t00z.pgrb2full.0p50.f006
    etc ....

    donc si je comprends bien ton code charge chacun d'eux, mais ecrase a chaque fois vers le target ? la ou je pensais que le target etait un dossier de destinations. mince alors

  20. #20
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2018
    Messages
    150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2018
    Messages : 150
    Points : 45
    Points
    45
    Par défaut
    merci donc c'est bien ce que je disais, et toi surtout aussi.
    a savoir, ton premier code semble etre celui qui reponds a ma question.
    et tes dernieres explications sont venus clarifier mes incomprehension. je te remercies.

    ne me reste plus qu'a mettre tout cela dans un dossier, et faire en sorte que quand tous les chargements sont fini lancer ma classe (methode ) de concatenations des fichiers. la aussi je n'ai du mal...
    c'est a dire que mon chargement et dans une classe "my window" puis j'ai cree une classe execution qui concatène. sauf que il me faut attendre la fin du chargement pour lancer la 2eme classe depuis la 1ere.

    le tout étant dans le même package

Discussions similaires

  1. Ne pas afficher d'alert lors de l'utilisation de shutdown.exe C#
    Par Florian_mbf dans le forum Développement Windows
    Réponses: 2
    Dernier message: 02/04/2014, 09h38
  2. Ne pas afficher le menu lors d'un click droit
    Par NEC14 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 04/07/2013, 10h59
  3. Réponses: 10
    Dernier message: 16/10/2008, 16h27
  4. Console JAVA à ne pas afficher
    Par BakaOnigiri dans le forum Général Java
    Réponses: 2
    Dernier message: 08/01/2008, 15h31
  5. Réponses: 2
    Dernier message: 11/12/2007, 14h58

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