# fehlerhafte Datei nach Dateitransfer per ServletOutputStream



## wimsie (28. Jun 2006)

Hallo zusammen,
ich habe ein Problem mit der Übertragung einer Datei vom Server zum Client mittels ServletOutputStream über eine JSP.
Ich generiere eine Datei und packe diese zusammen mit bereits vorhandenen Dateien in ein Jar und lege dieses auf dem Server ab. Bei diesem Jar handelt es sich um ein OpenDocument-File für OpenOffice. Wenn ich das File vom Serververzeichnis öffne, ist alles super.
Der Nutzer soll aber das generierte Dokument lokal speichern. Dazu schicke ich das File dann per OutputStream in den Response der JSP.
Die Datei kommt auch an, wird gespeichert und ist genauso groß wie die auf dem Server. Die Datei lässt sich aber nicht öffnen, da sie fehlerhaft sein soll.
Ich nutze SuSE Linux 10.1 und einen Resin Webcontainer als Apache2-Modul.
Ich habe einen compare der beiden Files gemacht, und festgestellt, das auf der Clientseite einige Bytes verändert sind. Warum das so ist kann ich mir nicht erklären. Die Programmierung an sich sollte ja stimmen, da die Übertragung funzt.
Hier dennoch mal mein Code:

```
File directory = new File("WEB-INF/tmp/"+filename+"/");
    	if(!directory.exists()){
    		directory.mkdir();
    	}    	
    	
    	String contentoutfile = directory+"/content.xml";
    	try{
    		FileOutputStream content2 = 
    			new FileOutputStream(contentoutfile);
    		content2.write(temporary.toString().getBytes("UTF-8"));
    		content2.flush();
            content2.close();
    	}catch(Exception e){
    		
    	}
    	
    	String[] filenames = new String[]{contentoutfile, "WEB-INF/tmp/mimetype", "WEB-INF/tmp/META-INF/manifest.xml"};
    	String[] zipfilenames = new String[]{"content.xml", "mimetype", "META-INF/manifest.xml"};
        
        // Create a buffer for reading the files
        
        try {
            // Create the ODS file (this is a JAR-Format)
        	String jaroutfile = "WEB-INF/tmp/"+filename+"/"+filename+".ods";
            JarOutputStream out = new JarOutputStream(new FileOutputStream(jaroutfile));
            
            byte[] buf = new byte[1024];
            // Compress the files
            for (int i=0; i<filenames.length; i++) {
                FileInputStream in = new FileInputStream(filenames[i]);
        
                // Add an entry to JAR file.
                JarEntry entry = new JarEntry(zipfilenames[i]);
                entry.setMethod(JarEntry.DEFLATED);
                entry.setSize( new File(filenames[i]).length());
                entry.setCompressedSize( new File(filenames[i]).length());
                out.putNextEntry(entry);
        
                // Transfer bytes from the file to the JAR file
                int len;
                while ((len = in.read(buf)) > 0) {
                    out.write(buf, 0, len);
                }
        
                // Complete this entry
                out.closeEntry();
                in.close();
            }
            out.flush();
            out.close();
            
            String fileName = filename+".ods";
            
            String dir;

            dir="WEB-INF/tmp/"+filename;
            

            byte[] buf2 = new byte[1024];
            	
            File file=new File(dir,fileName);
            InputStream in2=new FileInputStream(file);
            ServletOutputStream out2=rs.getOutputStream();
            //rs.setContentLength((int)file.length());
                
            int len2;
            while ((len2 = in2.read(buf2)) > 0) {
                out2.write(buf2, 0, len2);
            }
                
            in2.close();
            out2.flush();
            out2.close();
            
        } catch (IOException e) {
        }
```

Ich hoffe, jemand hat eine Idee woran es liegen könnte, das die übertragene Datei an einigen Stellen verändert ist.
Danke im Voraus.
Alexander


----------



## meez (28. Jun 2006)

Setz mal den "response" Header...


----------



## wimsie (28. Jun 2006)

Header und Content-Type werden bereits in der aufrufenden Methode gesetzt, bevor ich den "Response" übergebe.
Das ist auch nicht das Problem, da habe ich schon alles mögliche versucht.
Es macht auch keinen Unterschied, ob ich die Datei direkt in den OutputStream schreibe, ohne vorher auf die Platte zu sichern. Es tritt das selbe Problem auf.
Ich bin total ahnunglos, wo da der Fehler steckt.
Danke bisher.


----------

