【问题标题】:(how) can I download an image using JSoup?(如何)我可以使用 JSoup 下载图像吗?
【发布时间】:2012-09-10 01:01:36
【问题描述】:

我已经知道图像在哪里,但为了简单起见,我想使用 JSoup 本身下载图像。 (这是为了简化获取 cookie、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();

【问题讨论】:

标签: java jsoup


【解决方案1】:

我还没写完问题,就通过 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();

【讨论】:

  • 解释:图片是二进制数据,不是字符数据。 Response#body() 返回String,您应该取而代之的是检索原始字节数组。此外,使用Writer 将字节转换为字符,您应该坚持使用OutputStream
  • 确实,最初我在很多方面都错了。好吧,至少我希望我没有通过立即回复来超越我的界限:-p 至少在这个网站的任何地方都找不到这样的东西。
  • 感谢@BalusC!这些其他答案对我有帮助:如何获得 image bytes from JSoupsave bytes array to file
【解决方案2】:

你可以使用这些方法——

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

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多