java - 如何修复java下载按钮连续单击ClientAbortException:java.io.IOException错误?
问题描述
我的下载页面有两个下载(pdf 和安装程序)按钮。仅单击一次下载按钮时,它可以正常工作。但是当连续点击它会抛出一个ClientAbortException:java.io.IOException
错误。我为 ClientAbortException 找到了很多答案,但对我来说并不容易理解。有人可以帮我解决这个错误吗?
这是控制器中下载按钮的代码:
@Repository
public interface UserRepository extends JpaRepository<User, Long> {
User findByToken(String token);
}
@Controller
public class UserController {
@RequestMapping(value = "download", method = RequestMethod.POST, params = "action=ins")
public String downloadInstaller(HttpServletRequest request, HttpServletResponse response, @ModelAttribute User user, Model model)
{
User user2 = userRepository.findByToken(user.getToken());
if(user2.getDownload() == 0) {
user2.setDownload(1);
userRepository.save(user2);
File file = new File("File");
download(file, response);
log.info(Log.LOG_DOWNLOAD_INSTALLER);
return "";
}
return "downloaded";
}
@RequestMapping(value = "download", method = RequestMethod.POST, params = "action=pdf")
public String downloadPDF(HttpServletResponse response, @ModelAttribute User user, Model model) {
User user2 = userRepository.findByToken(user.getToken());
if(user2.getDownload() == 0) {
user2.setDownload(1);
userRepository.save(user2);
File file = new File("Pdf");
download(file, response);
log.info(Log.LOG_DOWNLOAD_PDF);
return "";
}
return "downloaded";
}
public void download(File file, HttpServletResponse response) {
try {
InputStream is = new FileInputStream(file);
response.setContentType("application/octet-stream");
// Response header
response.setHeader("Content-Disposition", "attachment; filename=\"" + file.getName() + "\"");
// Read from the file and write into the response
OutputStream os = response.getOutputStream();
byte[] buffer = new byte[1024];
int len;
while ((len = is.read(buffer)) != -1) {
os.write(buffer, 0, len);
}
os.flush();
os.close();
is.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
解决方案
您是否从“os.flush();”中得到异常?download() 方法的行?如果是这样,那基本上意味着发送请求的客户端不再等待响应。如果您提出了两个请求,则可能第一个请求失败。
如果通过多次单击按钮没有什么特别的目标,我想您可以捕获并忽略 download() 中的异常?
推荐阅读
- python - 如何删除字典字符串表示中值周围的引号?
- robotframework - Ride 中的循环数据完整性检查失败
- docker - Docker 容器中的热重载会在一段时间后停止工作
- java - Java File Downloader
- slack - Slack API slash commands and interactive components modal
- python - Python如何将自定义函数导入另一个脚本(任务计划程序中的问题)
- machine-learning - 连续变量的贝叶斯网络结构学习python包
- mobx-state-tree - mobx-state-tree 是否支持嵌套模型?
- php - 解码json值后如何显示该值?
- laravel - Laravel 中的搜索有很多关系