有一个servlet代码可以将excel/zip文件从生产服务器下载到本地机器。当我单击生产服务器上的"保存"或"打开"按钮时,它会抛出一个客户端中止异常。相同的代码在 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 左右。