2016-12-05 4 views
1

Ich versuche, Bilder herunterzuladen, die auf Amazon Web Services gehostet werden. Meine Methoden funktionieren gut auf jedem anderen Host, aber das Herunterladen eines Bildes aus dieser URL zum Beispiel http://s3-eu-west-1.amazonaws.com/static.melkweg.nl/uploads/images/scaled/event_header/18226 gibt mir Ärger. Es wird heruntergeladen, aber die Datei ist nur 49kb groß und kann nicht geöffnet werden.Das Herunterladen von Bildern von AWS gibt mir beschädigte Dateien

Ich habe verschiedene Methoden wie Apache FileUtils copyURLToFile, BufferedInputStream, ImageIO, usw. versucht Einige werfen Fehler, die meisten nur eine beschädigte Datei herunterladen.

Hier sind die Methoden, die ich versucht habe:

public static void downloadApache(String imageurl, String target) 
{ 
    try 
    { 
    File file = new File(target); 
    URL url = new URL(imageurl); 
    FileUtils.copyURLToFile(url, file); 
    } 
    catch(Exception e) 
    { 
     System.err.println("[3]Something went wrong."); 
    } 
} 

public static void downloadImage(String imageurl, String name) 
{ 
    try 
    { 
     URL url = new URL(imageurl); 
     InputStream in = new BufferedInputStream(url.openStream()); 
     OutputStream out = new BufferedOutputStream(new FileOutputStream(name)); 

     for (int i; (i = in.read()) != -1;) { 
      out.write(i); 
     } 
     in.close(); 
     out.close(); 
    } 
    catch(Exception e) 
    { 
     e.printStackTrace(); 
     System.err.println("[0]Something went wrong."); 
    } 
} 

public static void downloadImageIO(String imageurl, String target) 
{ 
    try 
    { 
     URL url = new URL(imageurl);  
     BufferedImage image = ImageIO.read(url); 
     ImageIO.write(image, "jpg", new File(target)); 
    } 
    catch(Exception e) 
    { 
     e.printStackTrace(); 
     System.err.println("[1]Something went wrong."); 
    } 
} 

public static void downloadImageCopy(String imageurl, String target) 
{ 
    try 
    { 
     try (InputStream in = new URL(imageurl).openStream()) { 
      Files.copy(in, Paths.get(target), StandardCopyOption.REPLACE_EXISTING); 
     } 
    } 
    catch(Exception e) 
    { 
     e.printStackTrace(); 
     System.err.println("[2]Something went wrong."); 
    } 
} 

Und hier ist die wichtigste Methode, wenn das von Interesse ist

public static void main(String[] args) 
{ 
    String imageurl = "http://s3-eu-west-1.amazonaws.com/static.melkweg.nl/uploads/images/scaled/event_header/18226"; 
    String name = "downloaded_image.jpg"; 
    String target = "C:/Users/Robotic/Downloads/" + name; 
    Download.downloadImage(imageurl, name); 
    Download.downloadImageCopy(imageurl, target); 
    Download.downloadImageIO(imageurl, target); 
    Download.downloadApache(imageurl, target); 
} 

Vielen Dank im Voraus.

+0

sind Sie sich bewusst, dass das Bild auf der URL, die Sie auch 49KB im Browser vorgesehen ist? Ich kann das Bild gut sehen und bekomme 'Content-Length: 49626' mit deaktiviertem Caching – Gelunox

Antwort

0

Die Datei, die Sie von S3 erhalten, ist gzip komprimiert, Sie müssen es entpacken, bevor Sie es lesen.

$ wget http://s3-eu-west-1.amazonaws.com/static.melkweg.nl/uploads/images/scaled/event_header/18226 
$ file 18226       
18226: gzip compressed data, from Unix 
0

Wie in der früheren Antwort darauf hingewiesen, ist es im Gzip-Format. Sie können die folgende Methode verwenden und erhalten die Datei entpackt

public static void downloadApache(String imageurl, String target) { 
    try { 
     File file = new File(target+".gzip"); 
     URL url = new URL(imageurl); 
     FileUtils.copyURLToFile(url, file); 

     byte[] buffer = new byte[1024]; 
     try { 
      java.util.zip.GZIPInputStream gzis = new java.util.zip.GZIPInputStream(new FileInputStream(file)); 
      FileOutputStream out = new FileOutputStream(target); 
      int len; 
      while ((len = gzis.read(buffer)) > 0) { 
       out.write(buffer, 0, len); 
      } 
      gzis.close(); 
      out.close(); 
     } catch (IOException ex) { 
      ex.printStackTrace(); 
     } 

    } catch (Exception e) { 
     System.err.println("[3]Something went wrong."); 
    } 
} 
Verwandte Themen