2017-02-11 12 views
0

私はzipにしてユーザーがダウンロードできるようにしたいシートを集めています。すべてのExcelシートを圧縮するには、java.util.zip.ZipOutputStreamライブラリを使用しました。java.util.zip.ZipException:重複したエントリ:動的WebプロジェクトTomcatランタイム例外

コードスニペットは以下の通りである:

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(); 

    } 

このコードは、Google Chromeブラウザから絶対に罰金を実行しています。私は、インターネットエクスプローラから自分のアプリケーションを実行すると、私は、実行時にこの例外をGET:

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 

私はなぜ重複したエントリの問題を把握することはできませんよ。 同じことを生成した場合、各Excelファイルの名前は一意であり、chromeはそのような例外を与えません。私はこれを解決する方法を理解するのに役立ちます。この問題の原因

私のInternet Explorerのバージョン: 以前11.713.10586.0

はEDITは私のボタンを提出するが、このようなものだった:

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

そしてsendAction機能は次のようでした:

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

ボタンのタイプがsubmitで、i n関数sendActionコードで送信しているので、同時に2回送信されていたと思います。

だから私はに、ボタンのHTMLの一部を変更:まだそれが二回提出なった

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

。そして、それはIEで正常に働いていた

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

は、その後、私はそれを変更しました。 ここで私が理解できないのは、type = "submit"というものがIEでフォーム提出を2回行った場合、なぜChromeで正常に動作したのかということです。 クロムでも、ボタンタイプがサブミットされているので2回提出する必要があります。また、「document.form.submit()」とハードコードしています。

誰でも私に理由を教えてもらえますか?

+0

:ように私は私のボタンのタイプを提出変更

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

zos.putNextEntry(エントリー) ;それはサーバーの内部にあります。 bowser固有のコードはありません。同じリクエストが同時に2回送信されないことを確認できますか? – efekctive

+0

@efekctiveはい、IEから実行すると、要求は同時に2回行われます。クロムでは、それはただ一回だけです。それはなぜそうですか?助けてもらえますか? –

+0

私に起こる唯一のことは、あなたのリクエスト/セッションを特定して、それらをサーバ上で追跡することです。 – efekctive

答えて

0

私の送信ボタンタイプはtype = "submit"で、この送信ボタンのjavascript関数onClickも呼び出していました。そのJavascript関数では、私はdocument.form.submit()を書いていたので、フォームは同時に2回提出されていました。

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

そしてsendAction機能のようなものだった:私はそれがここにスローされることを前提としてい

<div id="pageButtons"> 
     <button type="button" onClick="sendAction('submit')"> Submit </button> 
</div> 
関連する問題