2017-03-23 68 views
3

我試圖壓縮在字符串上轉換的Xml列表,只將它們保存在一個zip文件中,並作爲POST的主體返回。但每次我保存文件時,都會收到錯誤信息「存檔文件格式未知或已損壞」。壓縮(zip)使用ZipOutPutStream的文件列表Java

protected ByteArrayOutputStream zip(Map<String, String> mapConvertedXml) { 
    ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
    ZipOutputStream zos = new ZipOutputStream(baos); 
    try { 
     for(Map.Entry<String, String> current : mapConvertedXml.entrySet()){ 

      ZipEntry entry = new ZipEntry(current.getKey() + ".xml"); 
      entry.setSize(current.getValue().length()); 
      zos.putNextEntry(entry); 
      zos.write(current.getValue().getBytes()); 
      zos.flush(); 
     } 

     zos.close(); 

    } catch (IOException ioe) { 
     ioe.printStackTrace(); 
    } 
    return baos; 
} 

任何人都可以幫助我嗎?

+0

您是否嘗試在傳輸到網絡之前檢查zip文件? – nandsito

+1

你正在使用的字符集是什麼?因爲字符串的長度並不總是匹配字節數組的長度。 – Boschi

+0

@nandsito不,我沒有,是否有一個ZipOutputStream的功能? –

回答

0

要測試您的zip文件,請將它暫時保存在您的文件系統中,並打開它manualy。

FileOutputStream fos = new FileOutputStream(pathToZipFile); 
ZipOutputStream zos = new ZipOutputStream(fos); 

然後,你可以使用類似的東西來構建你的休息服務器並返回你的文件。

public static Response getFileLast(@Context UriInfo ui, @Context HttpHeaders hh) { 
    Response response = null; 
    byte[] sucess = null; 
    ByteArrayOutputStream baos = getYourFile(); 
    sucess = baos.toByteArray(); 
    if(sucess!=null) { 
     response = Response.ok(sucess, MediaType.APPLICATION_OCTET_STREAM).header("content-disposition","attachment; filename = YourFileName").build(); 
    } else { 
     response = Response.status(Status.NOT_FOUND).type(MediaType.APPLICATION_JSON).entity(new Error("Error downloading file.")).build(); 
    } 

    return response; 
} 

例如,您可以測試這個Advanced Rest Client