2017-02-11 2 views
0

ich eine Reihe von Excel-Sheets hava, die ich packen möchten, und ermöglichen es dem Benutzer, um sie herunterzuladen. Zum Zippen aller Excel-Tabellen habe ich die java.util.zip.ZipOutputStream-Bibliothek verwendet.java.util.zip.ZipException: doppelte Eintrag: Dynamisches Webprojekt Tomcat Laufzeit Ausnahme

Code Snippet wird unter gegeben:

protected ModelAndView onSubmit(HttpServletRequest request, HttpServletResponse response, Object command, 
      BindException errors) throws Exception { 
    // some code to get the list 
    Iterator<StudentSheet> it = list.iterator(); 
    ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
    ZipOutputStream zos = new ZipOutputStream(baos); 
    while (it.hasNext()) { 
     StudentSheet is = it.next(); 
     String fileName = is.getStudentCode() + "_" + is.getStudentName() + ".xls"; 
     fileName = fileName.replaceAll(" ", "_"); 
     logger.debug("FileName: " + fileName); 
     ZipEntry entry = new ZipEntry(fileName); 
     byte[] input =StudentManager.loadStudentSheetExcel(is.getId()); 
     entry.setSize(input.length); 
     zos.putNextEntry(entry); 
     zos.write(input); 
     zos.closeEntry(); 
     } 
    zos.close(); 
    String zipFileName = "ABC.zip"; 
    logger.debug("ZipFileName: " + zipFileName); 
    try { 
     streamZipOutput(zipFileName, "application/zip", baos, response); 
    } 
    catch (IOException e) { 
     e.printStackTrace(); 
    } 
    finally { 
     baos.close(); 
    } 
    return null; 
} 



public void streamZipOutput(String zipFileName, String type, ByteArrayOutputStream baos, 
      HttpServletResponse response) throws IOException { 

     response.setHeader("Content-Disposition", "attachment; filename=\"" + zipFileName + "\""); 
     response.setContentType(type); 

     response.getOutputStream().write(baos.toByteArray()); 
     response.flushBuffer(); 

    } 

Dieser Code absolut in Ordnung von Google Chrome-Browser ausgeführt wird. Wenn ich meine Anwendung von Internet Explorer ausführen, bekomme ich diese Ausnahme während der Laufzeit:

Feb 11, 2017 5:45:00 PM org.apache.catalina.core.StandardWrapperValve invoke 
SEVERE: Servlet.service() for servlet [action] in context with path [/appName] threw exception 
java.util.zip.ZipException: duplicate entry: 110_Vedant.xls 
    at java.util.zip.ZipOutputStream.putNextEntry(ZipOutputStream.java:232 

Ich bin nicht in der Lage, warum doppelten Eintrag Problem herauszufinden. Die Namen jeder Excel-Datei sind eindeutig und Chrome gibt keine Ausnahme, wenn ich das gleiche erzeuge. Hilf mir herauszufinden, wie ich das lösen kann. Was verursacht dieses Problem?

Mein Internet Explorer Version: 11.713.10586.0

EDIT Früher Taste war wie diese absenden:

<div id="pageButtons"> 
    <button type="submit" onClick="sendAction('submit')"> Submit </button> 
</div> 

Und die sendAction Funktion war wie:

function sendAction(anAction){ 
    document.form._action.value = anAction ; 
    document.form.submit(); 
} 

Also da der Button-Typ ist sende und auch ich n die Funktion sendAction, die ich mache, sende nach Code, also denke ich, dass es zweimal gleichzeitig gesendet wurde.

Also änderte ich den Knopf HTML-Teil zu:

<div id="pageButtons"> 
     <button onClick="sendAction('submit')"> Submit </button> 
</div> 

Noch zweimal vorgelegt wurde es.

Dann habe ich es zu:

<div id="pageButtons"> 
     <button type="button" onClick="sendAction('submit')"> Submit </button> 
</div> 

dann in IE Es hat gut funktioniert. Nun, was ich nicht verstehen kann, ist, wenn das Type = "submit" -Ding zweimal in IE zur Formularübergabe führte, warum es in Chrome gut lief. In Chrome auch, sollte es zweimal reichen, weil Button-Typ ist submit und ich habe auch hardcode "document.form.submit()".

Kann mir jemand den Grund geben?

+0

Ich gehe davon aus, dass es hier geworfen wird: zos.putNextEntry (Eintrag) ; Es ist tief im Server. Kein bowserspezifischer Code. Könnten Sie überprüfen, dass dieselbe Anfrage nicht zweimal gleichzeitig gesendet wird? – efekctive

+0

@efekctive Ja, wenn ich von IE laufe, wird die Anfrage zweimal gleichzeitig ausgeführt. In Chrom geht es nur einmal. Wieso ist es so ? Kannst du helfen ? –

+0

Das einzige, was mir einfällt, ist, Ihre Anfragen/Sitzungen zu identifizieren und sie auf dem Server zu verfolgen. – efekctive

Antwort

0

Mein Knopf einreichen war type = „submit“ und ich war auch ein Aufruf an eine Javascript-Funktion onClick dieser Schaltfläche einreichen zu machen. In dieser Javascript-Funktion hatte ich document.form.submit() geschrieben, also wurde das Formular zweimal gleichzeitig gesendet.

<div id="pageButtons"> 
    <button type="submit" onClick="sendAction('submit')"> Submit </button> 
</div> 

Und die sendAction Funktion war wie:

function sendAction(anAction){ 
    document.form._action.value = anAction ; 
    document.form.submit(); 
} 

Also änderte ich meinen Knopf einreichen wie:

<div id="pageButtons"> 
     <button type="button" onClick="sendAction('submit')"> Submit </button> 
</div> 
Verwandte Themen