現象
ファイルのダウンロードが100%に達したようですが止まらず、久しぶりに再度ダウンロードしました
理由
1.ファイルサイズが大きすぎる. 実際のファイルサイズは 49.89999 かもしれませんが、計算すると四捨五入され、計算が大きすぎます. この時点で、ダウンロードは完了していますが、プログラムはダウンロードが完了したと考えています.完了していません. プログラムはダウンロードを続行する必要がありますが, 実際のデータはありません. 最後に, ダウンロードは明らかに完了していますが, 不足しているという現象が発生します. 問題のコードは通常、次の 2 行に表示されます:
response.setContentLengthLong(Long.valueOf(size));
また
response.setContentLength(Long.valueOf(size));
解決
サイズを削除または再計算するだけです
-----その他よくあるご質問
1. 応答ヘッダー、ファイル名とファイル タイプを指定
// 3. 获取响应输出流
response.setContentType("text/plain;charset=UTF-8");
// 4. 附件下载 attachment 附件 inline 在线打开(默认值)
response.setHeader("content-disposition", "attachment;fileName=" + fileName);
2. 中国語名の処理
//处理中文名
String userAgent=request.getHeader("User-Agent");//里面包含了设备类型
System.out.println(userAgent);
if(-1!=userAgent.toLowerCase().indexOf("chrome")){
//如果是谷歌
downloadFileName = new String(downloadFileName.getBytes("UTF-8"), "iso-8859-1");
}else{
//如果是IE
downloadFileName = new String(downloadFileName.getBytes("GBK"),"iso-8859-1");
}
response.setCharacterEncoding("utf-8");
3.大きなファイルを防ぐために出力をループする
byte[] bytes = new byte[1024];
int cnt=0;
while ((cnt=in.read(bytes,0,bytes.length)) != -1) {
output.write(bytes, 0, cnt);
}
4. 出力ストリームを閉じる前にフラッシュする
//清空通道
output.flush();
5.タイムアウト時間とモード選択
ftpならモード選択に注意してパッシブモードをオンにする
ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);
ftpClient.enterLocalPassiveMode(); // 用被动模式传输
ftpClient.setDefaultTimeout(defaultTimeout);// 设置默认超时时间
// 设置缓存区
ftpClient.setBufferSize(1024 * 1024 * 10);
sftpの場合はタイムアウト時間を設定する
session.setTimeout(60000);