Hallo,
ich versuche eine zip-Datei zu streamen. Dazu habe ich folgenden Test gemacht. Der Stream funktioniert soweit.
Allerdings ist die zip-Datei fehlerhaft. Der Fehler macht sich beim öffnen der Datei bemerkbar. Anscheinend stimmen irgendwelche Offsets noch nicht. Was kann das Problem sein?
ich versuche eine zip-Datei zu streamen. Dazu habe ich folgenden Test gemacht. Der Stream funktioniert soweit.
Java:
private final int bufferszize = 1024*16;
private SessionOutputBuffer wrapOutputStream( final OutputStream outputStream) {
return new SessionOutputBufferImpl(new HttpTransportMetricsImpl(), bufferszize) {{
bind(outputStream);
}};
}
static final String AB = " 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
static Random rnd = new Random();
private String randomString( int len ){
StringBuilder sb = new StringBuilder( len );
for( int i = 0; i < len; i++ ) {
sb.append(AB.charAt(rnd.nextInt(AB.length())));
}
return sb.toString();
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// Let's send the headers first
resp.setContentType("application/zip, application/octet-stream");
resp.setHeader("content-disposition", "attachment;filename=test.zip");
resp.setHeader("Connection", "keep-alive");
resp.setHeader("Transfer-Encoding", "chunked");
resp.flushBuffer();
final SessionOutputBuffer os = wrapOutputStream(resp.getOutputStream());
ChunkedOutputStream cos;
cos = new ChunkedOutputStream(bufferszize,os);
ZipOutputStream zos = new ZipOutputStream(cos);
int testfiles;
for (testfiles=0; testfiles<100; testfiles++){
String name = "./fileNr." + String.valueOf(testfiles) +".txt";
ZipEntry ze = new ZipEntry(name);
ze.setTime(new Date().getTime());
zos.putNextEntry(ze);
String br="\n";
for(int kilobyte=0; kilobyte<100; kilobyte++) {
String random = randomString(1000)+"\n";
byte[] bytes = random.toString().getBytes();
zos.write(bytes,0,bytes.length);
zos.flush();
cos.flush();
}
zos.closeEntry();
}
cos.flush();
zos.close();
cos.close();
}
Allerdings ist die zip-Datei fehlerhaft. Der Fehler macht sich beim öffnen der Datei bemerkbar. Anscheinend stimmen irgendwelche Offsets noch nicht. Was kann das Problem sein?
Code:
~/test$ wget -O test.zip --no-check-certificate https://localhost/ziptest
200 OK
Länge: nicht spezifiziert [application/zip, application/octet-stream]
In »»test.zip«« speichern.
test.zip [ <=> ] 7,22M 9,19MB/s in 0,8s
»Last-modified«-Kopfzeile ungültig -- Zeitstempel übergangen.
2016-12-23 15:22:52 (9,19 MB/s) - »test.zip« gespeichert [7572534]
~/test$ unzip test.zip
Archive: test.zip
warning [test.zip]: 8312 extra bytes at beginning or within zipfile
(attempting to process anyway)
file #1: bad zipfile offset (local header sig): 8312
(attempting to re-compensate)
file #1: bad zipfile offset (local header sig): 8312
file #2: bad zipfile offset (local header sig): 75574
(attempting to re-compensate)
file #2: bad zipfile offset (local header sig): 75574
file #3: bad zipfile offset (local header sig): 159464