2012-09-17 27 views
30

Ya sé dónde está la imagen, pero por simplicidad, quería descargar la imagen usando JSoup. (Esto es para simplificar conseguir galletas, de referencia, etc.)(cómo) puedo descargar una imagen usando JSoup?

Esto es lo que tengo hasta ahora:

//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

puede hacerlo sin jsoup con éste revestimiento. [FileUtils # copyURLToFile] (http://commons.apache.org/io/apidocs/org/apache/commons/io/FileUtils.html). – Sorter

Respuesta

38

ni siquiera terminar de escribir la pregunta antes de encontrar la respuesta a través de JSoup y una poca experimentación.

//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

Explicación: Las imágenes son datos binarios, no datos de caracteres. 'Response # body()' devuelve un 'String', en su lugar debería recuperar el conjunto de bytes sin formato. Además, al usar un 'Writer' convierte bytes en caracteres, debe seguir' OutputStream'. – BalusC

+0

De hecho, inicialmente me equivoqué en muchos aspectos. Bueno, al menos espero no sobrepasar mis límites al escribir una respuesta inmediata: al menos, no pude encontrar algo como esto en ningún lugar de este sitio. –

+1

Gracias @BalusC! Estas otras respuestas me ayudaron: cómo obtener [bytes de imágenes de JSoup] (http://stackoverflow.com/a/12663619/519951) y [guardar el array de bytes en el archivo] (http://stackoverflow.com/questions/1580038/byte-array-to-image-file) – ruhong

1

Simplemente puede utilizar estos métodos-

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

}

Cuestiones relacionadas