java - 如何修复java下载按钮连续点击ClientAbortException : java. io.IOException错误?

标签 java spring

我的下载页面有两个下载(pdf 和安装程序)按钮。当下载按钮仅单击一次时,它就可以正常工作。但是,当连续单击时,它会抛出 ClientAbortException:java.io.IOException 错误。我找到了许多有关 ClientAbortException 的答案,但它们对我来说并不容易理解。有人可以帮我解决这个错误吗?

这是我在 Controller 中下载按钮的代码:

@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() 中的异常?

关于java - 如何修复java下载按钮连续点击ClientAbortException : java. io.IOException错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51782258/

相关文章:

java:创建zip文件时刷新流

java - 如果我在 Java 中的 TIMED_WAIT 中有 3000 个线程,对 CPU 有什么影响?

java - REST API 调用是否应该在存储库层上使用 @Repository 进行?

spring - 使用 Reactive MongoDB 进行流式传输并且正在取消耗时操作

java - Spring Boot应用程序关闭时不会禁止新的传入连接,但会突然退出

java - 业务层是否应该将持久化对象返回给UI层?

java - 属性和环境始终为空

java - 从 JSON 文件获取信息并在单例类的属性中使用该数据

java - 如何打包静态加载的JNI库?

java - 如何使我的 URL 仅为 "localhost:8080/*"?