2

私は JSoup を使用して、この URL http://www.aw20.co.uk/images/logo.pngのコンテンツを取得しようとしています。これはイメージ logo.png であり、ファイルに保存します。これまでのところ、JSoup を使用してhttp://www.aw20.co.ukに接続し、ドキュメントを取得しました。次に、探している画像の絶対URLを見つけましたが、実際の画像を取得する方法がわかりません。それで、誰かが私を正しい方向に向けてくれることを望んでいましたか?とにかく私は Jsoup.connect("http://www.aw20.co.uk/images/logo.png").get(); を使用できますか? 画像を取得するには?

import java.io.IOException;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;


public class JGet2 {

public static void main(String[] args) {

    try {
        Document doc = Jsoup.connect("http://www.aw20.co.uk").get();

        Elements img = doc.getElementsByTag("img");

        for (Element element : img) {
            String src = element.absUrl("src");

            System.out.println("Image Found!");
            System.out.println("src attribute is: " + src);
            if (src.contains("logo.png") == true) {
                System.out.println("Success");     
            }
            getImages(src);
        }
    } 

    catch (IOException e) {
        e.printStackTrace();
    }
}

private static void getImages(String src) throws IOException {

    int indexName = src.lastIndexOf("/");

    if (indexName == src.length()) {
        src = src.substring(1, indexName);
    }

    indexName = src.lastIndexOf("/");
    String name = src.substring(indexName, src.length());

    System.out.println(name);
}
}
4

5 に答える 5

10

HTMLとして解析したくない場合は、Jsoupを使用して任意のURLをフェッチし、データをバイトとして取得できます。例えば:

byte[] bytes = Jsoup.connect(imgUrl).ignoreContentType(true).execute().bodyAsBytes();

ignoreContentType(true)そうしないと、JsoupがコンテンツがHTMLで解析できないという例外をスローするため、が設定されます。この場合bodyAsBytes()は、解析ではなく応答本文の取得に使用しているため、これで問題ありません。

詳細については、 JsoupConnectionAPIを確認してください。

于 2012-09-30T17:58:13.043 に答える
5

Jsoupは、URLのコンテンツをダウンロードするようには設計されていません。

サードパーティのライブラリを使用できるため、次を使用して、特定のURLのコンテンツをファイルにダウンロードするためのApacheCommonIOを試すことができます。

FileUtils.copyURLToFile(URL source, File destination);

たった一行です。

于 2012-09-30T00:24:25.503 に答える
1

これらの方法またはこれらの方法の一部を使用して、問題を解決できます。注: IMAGE_HOME は絶対パスです。例 /home/あなたの名前/フォルダ名

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

}

于 2016-08-08T11:45:26.597 に答える
0

とにかく私は Jsoup.connect("http://www.aw20.co.uk/images/logo.png").get(); を使用できますか? 画像を取得するには?

いいえ、JSoup はテキストなどを取得するだけで、ファイルやバイナリ データのダウンロードには使用できません。つまり、JSoup で取得したファイル名とパスを使用し、標準の Java I/O を使用してファイルをダウンロードします。

ダウンロードにはNIOを使用しました。つまり、

     String imgPath = // ... url path to image
     String imgFilePath = // ... file path String

     URL imgUrl;
     ReadableByteChannel rbc = null;
     FileOutputStream fos = null;
     try {
        imgUrl = new URL(imgPath);
        rbc = Channels.newChannel(imgUrl.openStream());
        fos = new FileOutputStream(imgFilePath);
        // setState(EXTRACTING + imgFilePath);
        fos.getChannel().transferFrom(rbc, 0, 1 << 24);

     } catch (MalformedURLException e) {
        e.printStackTrace();
     } catch (FileNotFoundException e) {
        e.printStackTrace();
     } catch (IOException e) {
        e.printStackTrace();
     } finally {
        if (rbc != null) {
           try {
              rbc.close();
           } catch (IOException e) {
              e.printStackTrace();
           }
        }
        if (fos != null) {
           try {
              fos.close();
           } catch (IOException e) {
              e.printStackTrace();
           }
        }
     }
于 2012-09-30T00:15:07.880 に答える