Загрузка изображения в Java - PullRequest
0 голосов
/ 25 января 2019

Мне нужно скачать изображение с сайта НАСА. Проблема в том, что мой код иногда работает, успешно загружая изображение, а иногда сохраняет только 186B (не знаю, почему именно 186).

Проблемы наверняка связаны с тем, как НАСА хранит эти фотографии. Например, изображение по этой ссылке https://mars.jpl.nasa.gov/msl-raw-images/msss/00001/mcam/0001ML0000001000I1_DXXX.jpg успешно сохранено, а по этой ссылке https://mars.nasa.gov/mer/gallery/all/2/f/001/2F126468064EDN0000P1001L0M1-BR.JPG не удалось.

Вот мой код

public static void saveImage(String imageUrl, String destinationFile){
    URL url;
    try {
        url = new URL(imageUrl);
        System.out.println(url);
        InputStream is = url.openStream();
        OutputStream os = new FileOutputStream(destinationFile);

        byte[] b = new byte[2048];
        int length;

        while ((length = is.read(b)) != -1) {
            os.write(b, 0, length);
        }

        is.close();
        os.close();
    } catch (MalformedURLException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

}

У кого-то есть идея, почему она не работает?


public boolean downloadPhotosSol(int i) throws JSONException, IOException {
    String url0 =  "https://api.nasa.gov/mars-photos/api/v1/rovers/spirit/photos?sol=" + this.chosenMarsDate + "&camera=" + this.chosenCamera + "&page=" + i + "&api_key=###";
    JSONObject json = JsonReader.readJsonFromUrl(url0);
    if(json.getJSONArray("photos").length() == 0) return true;
    String workspace = new File(".").getCanonicalPath();
    String pathToFolder = workspace+File.separator+this.getManifest().getName() + this.chosenMarsDate + this.chosenCamera +"Strona"+i;
    new File(pathToFolder).mkdirs();
    for(int j = 0;j<json.getJSONArray("photos").length();j++) {
        String url = ((JSONObject) json.getJSONArray("photos").get(j)).getString("img_src");
        SaveImage.saveImage(url, pathToFolder+File.separator+"img"+j+".jpg");
    }
    return false;
}

Ответы [ 2 ]

0 голосов
/ 25 января 2019

Когда вы получите файл размером 186 байт, откройте его в текстовом редакторе и посмотрите, что внутри. Может содержать сообщение об ошибке HTTP в формате HTML. Если вместо этого вы видите первые 186 байтов вашего файла изображения, значит, что-то не работает с вашей программой.

РЕДАКТИРОВАТЬ: Судя по вашим комментариям, вы получаете ответ HTTP 301, который является перенаправлением в другое место. Веб-браузер обрабатывает это автоматически без вашего ведома. Однако ваша Java-программа не выполняет перенаправление на новое место. Вам необходимо использовать HTTP-библиотеку Java, которая обрабатывает перенаправления.

0 голосов
/ 25 января 2019

Лучший и короткий способ сделать это:

try(InputStream in = new URL("http://example.com/image.jpg").openStream()){
    Files.copy(in, Paths.get("C:/File/To/Save/To/image.jpg"));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...