2012-09-17 19 views
30

Już wiem, gdzie jest obraz, ale dla uproszczenia chciałem pobrać obraz za pomocą samego JSoup. (To jest uproszczenie coraz cookie, referrer, itp)(jak) mogę pobrać obraz za pomocą JSoup?

To, co mam tak daleko:

//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(); 
+3

można to zrobić bez jsoup z tej jednej wkładki. [FileUtils # copyURLToFile] (http://commons.apache.org/io/apidocs/org/apache/commons/io/FileUtils.html). – Sorter

Odpowiedz

38

nawet nie dokończyć pisanie na pytanie zanim znalazłem odpowiedź poprzez JSoup oraz małe eksperymenty.

//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(); 
+3

Objaśnienie: Obrazy są danymi binarnymi, a nie znakowymi. 'Response # body()' zwraca 'String', zamiast tego powinieneś pobrać tablicę bajtów raw. Ponadto, używając 'Writer' konwertuje bajty na znaki, powinieneś trzymać się' OutputStream'. – BalusC

+0

Rzeczywiście, początkowo myliłem się z wielu powodów. Cóż, przynajmniej mam nadzieję, że nie przekroczyłem moich granic, pisząc natychmiastową odpowiedź :-p Nie mogłem znaleźć niczego podobnego nigdzie na tej stronie, przynajmniej. –

+1

Dzięki @BalusC! Te inne odpowiedzi pomogły mi: jak zdobyć [obraz bajtów z JSoup] (http://stackoverflow.com/a/12663619/519951) i [zapisać bajty tablicy do pliku] (http://stackoverflow.com/questions/1580038/byte-array-to-image-file) – ruhong

1

prostu można z nich korzystać METODY

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

}

Powiązane problemy