有一个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防火墙设备发生冲突,这可能存在于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或左右。