使用java生成并下载存档zip

时间:2017-07-26 19:09:58

标签: javascript java

我有一个zip文件下载功能。 此函数在服务器的输出文件夹中生成 .zip 文件并下载。 一切都很完美!

然而,使用多用户进行测试并不起作用。 如果3个用户同时尝试生成文件,则只返回一个响应文件以供下载。 其他2个用户正在等待,并且没有结果(没有错误发生,ajax调用永远不会返回)。

我的代码:

JavaScript的:

         $.fileDownload('\GenereteZipAction', {
            httpMethod: "POST",
            data: $('#formZip').serialize()
        }).done(function () {
            alert('Download successfully.');
            $('#modalZipLoading').modal('hide');
         })
        .fail(function () {
            alert('Error');
            $('#modalZipLoading').modal('hide');
         });

爪哇:

//get the name of user
userName = request.getParameter("user");

//get real path
String realPath = getServletContext().getRealPath("/");

//create user folder
File fileOutput = new File(realPath+"/reports/output/"+userName);
fileOutput.mkdirs();

//generete reports in the user output folder
ReportHelper helper = new ReportHelper();
helper.genereteReports(fileOutput);

//set the reponse and... 
response.setContentType("application/zip");
response.addHeader("Content-Disposition", "attachment;filename=Relatorios.zip");
//set the cookie for $.fileDownload go to done function 
response.setHeader("Set-Cookie", "fileDownload=true; path=/"); 

//zip output user folder 
ZipHelper zipHelper = new ZipHelper ();
zipHelper.zipAllfiles(fileOutput);

//create and fill ZipOutputStream
ZipOutputStream zip = new ZipOutputStream(response.getOutputStream());
zipHelper.fillZipOutputStream(zip);

//do download
zip.flush();

//close 
zip.close();

//delete folder
deleteDir(fileOutput);

我的系统适用于超过五千名用户,所以我确信两个以上的用户会同时使用报告生成功能。 我没有太多关于aplication server的信息,只知道它是IBM WebSphere。

我不知道问题是在我的代码中,还是在服务器上 不允许多用户。欢迎各方面的帮助!!!

1 个答案:

答案 0 :(得分:2)

您很可能遇到线程安全问题。这可能会对您有所帮助:https://www.quora.com/What-does-the-term-thread-safe-mean-in-Java

ReportHelperZipHelper可能不是线程安全的。 genereteReports看起来正在修改文件系统上的内容。我会仔细查看代码并在每一行上问自己,“当我的第一个线程执行此行时,如果其他东西试图执行会发生什么?”我建议调查synchronized次来电及其工作原理。