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