私はスプリングブート1.4.3.RELEASEから1.5.1.RELEASEに切り替えました。私は、アーカイブの内容を書き込むHttpServletResponseを用意しています。アーカイブのコンテンツは、残りのエンドポイント経由でダウンロードできます。ファイルはダウンロードされますが、私はzip unarchiverでこれ以上開くことができません。これは、スプリングブート1.4.3を使用する場合には当てはまりません。Springブート1.5.1にアップグレードした後にzipアーカイブを開くことができません
レスポンスヘッダがこの
X-Frame-Options:DENY
Cache-Control:no-cache, no-store, max-age=0, must-revalidate
X-Content-Type-Options:nosniff
Content-Disposition:attachment; filename="myfile.zip"
Connection:close
Pragma:no-cache
Expires:0
Content-Transfer-Encoding:binary
X-XSS-Protection:1; mode=block
Content-Length:1054691
Date:Tue, 28 Feb 2017 05:39:32 GMT
Content-Type:application/zip
もののように見えるが、応答にファイルを書き込んで責任メソッドです:
public void writeZipToResponse(HttpServletResponse response) throws IOException {
Optional<MyObject> myObject= findMyObject();
if (myObject.isPresent()) {
response.addHeader("Content-type", AdditionalMediaTypes.APPLICATION_ZIP);
response.addHeader("Content-Transfer-Encoding", "binary");
response.addHeader("Content-Disposition", "attachment; filename=\"" + myObject.get().getName() + ".zip\"");
response.setStatus(HttpStatus.OK.value());
int lengthOfFile = writeObjectAsArchive(myObject.get(), response.getOutputStream());
response.addHeader("Content-Length", String.valueOf(lengthOfFile));
}
else {
response.setStatus(HttpStatus.NOT_FOUND.value());
}
}
と、この:
int writeObjectAsArchive(Collection<Dummy> dummies, OutputStream out) {
try {
ZipOutputStream zipArchive = new ZipOutputStream(out);
int length = 0;
for (Dummy dummy: dummies) {
ZipEntry entry = new ZipEntry(dummy.getFileName());
zipArchive.putNextEntry(entry);
byte[] fileAsByteArray = dummy.getFileAsByteArray();
zipArchive.write(fileAsByteArray);
zipArchive.closeEntry();
length += fileAsByteArray.length;
}
zipArchive.finish();
return length;
}
catch (IOException e) {
throw new RuntimeException(e);
}
}
ストリームを早期にクローズしているか、まったく閉じていない可能性があります。ソースコードを追加できますか? – bekce
私はコードを追加しましたが、これは春のブート1.4.3で動作すると言いました。 – BadChanneler