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.
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();
}
}
} |
Partager