私は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()」とハードコードしています。
誰でも私に理由を教えてもらえますか?
:ように私は私のボタンのタイプを提出変更
zos.putNextEntry(エントリー) ;それはサーバーの内部にあります。 bowser固有のコードはありません。同じリクエストが同時に2回送信されないことを確認できますか? – efekctive
@efekctiveはい、IEから実行すると、要求は同時に2回行われます。クロムでは、それはただ一回だけです。それはなぜそうですか?助けてもらえますか? –
私に起こる唯一のことは、あなたのリクエスト/セッションを特定して、それらをサーバ上で追跡することです。 – efekctive