# Download von Bildern nur zur hälfte



## rtt (26. Mrz 2007)

Hallo,
ich habe ein Programm, welches mir auf Anfrage von einer Website Bilder rendert. Das zu rendernde Bild wird komplett auf einem Laufwerk gespeichert.

Sobald dies geschehen ist, soll der User das Bild über ein Servlet herunterladen können.
Jatzt hab ich ein komisches Verhalten bemerkt. Wenn der Downloaddialog kommt und ich sofort auf öffnen klicke, wird mir das Bild angezeigt. Nur fehlt da immer ein Teil (unterer Teil des Bildes ist schwarz).
Lasse ich mir allerdings ein paar Sekunden Zeit, bevor ich auf offnen klicke, ist das Bild komplett.

Hab deswegen schon mal eine Verzögerung von 5 Sekunden in das Servlet eingebaut, was dem teilweise abhilfe schafft. Nur ist das keine saubere Lösung und bei größeren Bildern (Auflösung 4800x3600 Pixel) bleibt meist noch ein kleiner Teil schwarz.

Hat jemand schon mal einen ähnlichen Effekt bemerkt?
Was kann man dagegen tun?

Hab hier mal mein Servlet-code:

```
public class GetRenderedImageServlet extends HttpServlet{
	
	public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
     
      try {
		  AdminService adminService = ServiceLocator.instance().getAdminService();
		  String sDataPoolRoot = adminService.getDataPoolRoot();
		  
		  // get Server Url
		  String sOwnURL = adminService.getSettings().getUrl();		  
		  String sRenderedImage = request.getParameter("param").replace(sOwnURL, sDataPoolRoot);
		  
		  // wait 5 seconds
		  int itime = 5000;
		  long lcurrentSystemTime = System.currentTimeMillis();		  		  
		  while( System.currentTimeMillis() <= (lcurrentSystemTime + itime) ){
			  System.out.print("Servlet wait: " +( (lcurrentSystemTime + itime)-System.currentTimeMillis() )+" | ");
		  }
		  		  
		  File file = new File(sRenderedImage);		  
		  InputStream input = new BufferedInputStream(new FileInputStream(file));
		  OutputStream out = new BufferedOutputStream(response.getOutputStream());
		  
		  StringBuilder filename = new StringBuilder("attachment; filename=").append(file.getName());
		  response.setContentType("application/octet-stream");
		  response.setHeader("Content-disposition", filename.toString());

		  System.out.println("\nFile size: "+file.length());
		  System.out.println("Header: "+"Content-disposition "+filename.toString());
    	  
		  byte[] buffer = new byte[input.available()];
		  System.out.println("buffer size: "+buffer.length);
    	  
		  // read file till end of file (eof)
		  while( input.read(buffer) != -1) {  
			  out.write( buffer );
			  out.flush();
		  }
          
		  input.close();
		  out.close();          
    	            
	    } 
      catch (Exception e) {
          System.out.println("not successfully sent");
    	  throw new ServletException(e);
      }
  }
}
```

Danke
Gruß Robin


----------



## Sanix (26. Mrz 2007)

Du bist sicher, dass das Bild schon vollständig auf der Festplatte kreiert wurde?


----------



## rtt (26. Mrz 2007)

hab nochmal getestet.
Es hat sich herrausgestellt, das das Servlet zu zeitig aufgerufen wurde, obwohl noch nicht alle Daten in die Datei geschrieben wurden.
Ich Prüfe nun die Dateigröße, ob diese sich verändert. Damit funktionierts 

Danke
Gruß Robin


----------

