簡體   English   中英

如何修復java下載按鈕連續單擊ClientAbortException:java.io.IOException錯誤?

[英]How fix java download button continuous click ClientAbortException: java.io.IOException error?

我的下載頁面有兩個下載(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()中的異常嗎?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM