有一个Servlet代码,可将excel / zip文件从生产服务器下载到本地计算机。当我在生产服务器上单击“保存”或“打开”按钮时,它将引发ClientAbortException。相同的代码在Dev和UAT中效果很好。而且此错误并非总是出现。以下是相同的代码-

        response.setContentType("application/download");
        response.setHeader("Content-Disposition", "attachment; filename= \""+ fileName +"\"");
        fin = new FileInputStream(f);
        int size = fin.available();
        response.setContentLength(size);
        byte[] ab = new byte[size];

        os = response.getOutputStream();

        int bytesread;

        do{
            bytesread = fin.read(ab,0,size);
            if(bytesread >-1) {
                os.write(ab,0,bytesread );
            }
        } while(bytesread >-1);
        os.flush();
        os.close();

最佳答案

您可能正在运行HTML防火墙设备,这在产品环境中会存在,但在测试环境中不会存在。

另外,您的代码将无法很好地扩展。如果500个用户都尝试同时下载一个50 MB的文件,您的服务器会发生什么情况?

您可以构建一个可扩展的循环,如下所示:

byte[] buffer = new byte[bufferSize];
int bytesRead = input.read(buffer);
while (bytesRead > 0) {
    output.write(buffer, 0, bytesRead);
    bytesRead = input.read(buffer);
}


选择一个合适的bufferSize,例如20480左右。

关于java - 面对ClientAbortException,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18712965/

10-12 03:20