用Java下载图像

时间:2019-01-25 18:11:07

标签: java http http-headers

我必须从NASA网站下载图片。问题是,我的代码有时可以正常工作,成功下载了图像,而有时却只保存了186B(不知道为什么是186B)。

问题肯定与美国航空航天局(NASA)处理这些照片的方式有关。例如,来自该链接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 :(得分:2)

当您获得186字节的文件时,请使用文本编辑器将其打开,然后查看其中的内容。它可能包含HTML格式的HTTP错误消息。相反,如果您看到图像文件的前186个字节,则说明您的程序无法正常工作。

编辑:从您的评论看来,您正在获得HTTP 301响应,该响应是到另一个位置的重定向。 Web浏览器会自动处理此问题,而无需您注意。但是,您的Java程序未遵循重定向到新位置的操作。您需要使用处理重定向的HTTP Java库。

答案 1 :(得分:1)

最佳和简短的方法:

try(InputStream in = new URL("http://example.com/image.jpg").openStream()){
    Files.copy(in, Paths.get("C:/File/To/Save/To/image.jpg"));
}