我该如何使用JSoup下载图片?

36

我已经知道了图片的位置,但为了简单起见,我希望使用JSoup本身来下载图片。(这是为了简化获取cookies、referrer等操作。)

目前我已经有了以下内容:

//Open a URL Stream
Response resultImageResponse = Jsoup.connect(imageLocation).cookies(cookies).ignoreContentType(true).execute();

// output here
OutputStreamWriter out = new OutputStreamWriter(new FileOutputStream(new java.io.File(outputFolder + name));
//BufferedWriter out = new BufferedWriter(new FileWriter(outputFolder + name));
out.write(resultImageResponse.body());          // resultImageResponse.body() is where the image's contents are.
out.close();

5
你可以使用这个一行代码就能实现而不需要jsoup:FileUtils#copyURLToFile - Sorter
2个回答

53

我甚至还没写完问题,就通过JSoup和一些实验找到了答案。

//Open a URL Stream
Response resultImageResponse = Jsoup.connect(imageLocation).cookies(cookies)
                                        .ignoreContentType(true).execute();

// output here
FileOutputStream out = (new FileOutputStream(new java.io.File(outputFolder + name)));
out.write(resultImageResponse.bodyAsBytes());  // resultImageResponse.body() is where the image's contents are.
out.close();

4
图片是二进制数据,不是字符数据。Response#body()返回一个字符串,你应该获取原始的字节数组。另外,使用Writer会将字节转换为字符,你应该使用OutputStream - BalusC
事实上,一开始我犯了很多错误。好吧,至少我希望我没有越界写下即时回复 :-p 至少在这个网站上找不到类似的东西。 - user1499731
1
感谢@BalusC!这些其他答案对我很有帮助:如何从JSoup获取图像字节将字节数组保存到文件 - ruhong

1
只需要使用这些方法即可-
public static String storeImageIntoFS(String imageUrl, String fileName, String relativePath) {
    String imagePath = null;
    try {
        byte[] bytes = Jsoup.connect(imageUrl).ignoreContentType(true).execute().bodyAsBytes();
        ByteBuffer buffer = ByteBuffer.wrap(bytes);
        String rootTargetDirectory = IMAGE_HOME + "/"+relativePath;
        imagePath = rootTargetDirectory + "/"+fileName;
        saveByteBufferImage(buffer, rootTargetDirectory, fileName);
    } catch (IOException e) {
        e.printStackTrace();
    }
    return imagePath;
}

public static void saveByteBufferImage(ByteBuffer imageDataBytes, String rootTargetDirectory, String savedFileName) {
   String uploadInputFile = rootTargetDirectory + "/"+savedFileName;

   File rootTargetDir = new File(rootTargetDirectory);
   if (!rootTargetDir.exists()) {
       boolean created = rootTargetDir.mkdirs();
       if (!created) {
           System.out.println("Error while creating directory for location- "+rootTargetDirectory);
       }
   }
   String[] fileNameParts = savedFileName.split("\\.");
   String format = fileNameParts[fileNameParts.length-1];

   File file = new File(uploadInputFile);
   BufferedImage bufferedImage;

   InputStream in = new ByteArrayInputStream(imageDataBytes.array());
   try {
       bufferedImage = ImageIO.read(in);
       ImageIO.write(bufferedImage, format, file);
   } catch (IOException e) {
       e.printStackTrace();
   }

}


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接