2017-02-28 7 views
0

私はスプリングブート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); 
} 
} 
+0

ストリームを早期にクローズしているか、まったく閉じていない可能性があります。ソースコードを追加できますか? – bekce

+0

私はコードを追加しましたが、これは春のブート1.4.3で動作すると言いました。 – BadChanneler

答えて

1

あなたは閉じる必要があります出力ストリーム。

int writeObjectAsArchive(Collection<Dummy> dummies, OutputStream out) { 
    try { 
    ZipOutputStream zipArchive = new ZipOutputStream(out); 
    ... 
    zipArchive.finish(); 
    zipArchive.close(); 
    return length; 
    } 
    catch (IOException e) { 
    throw new RuntimeException(e); 
    } 
} 
+0

私は終わったと思って、それをやっています。どうもありがとう ! – BadChanneler

+0

お受け取りいただきありがとうございました、楽しんでください:) – bekce

関連する問題