1

有一个 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(); 
4

1 回答 1

0

您可能与 HTML 防火墙设备发生冲突,该设备可能存在于 prod 环境中,但不存在于您的测试环境中。

此外,您的代码不会很好地扩展。如果 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 或附近。

于 2013-09-10T08:00:31.160 回答