Контроллер открывает файл в браузере, а не загружает его

Я создал контроллер для загрузки файла, он отлично работает для небольших файлов, но для больших вместо загрузки он просто открывает файл в браузере (файл 2 КБ был загружен, но открыт 12 КБ). Мне известны различные варианты загрузки файла с контроллера, но я хотел бы знать, в чем основная причина проблемы в моем коде.

Мой контроллер:

    @GetMapping("/logs/getfile")
    public void getFile(@RequestParam String logFile,HttpServletResponse response) {
        try {           
            String directory = "C:\\Users\\user\\Documents\\";          
            InputStream is=new FileInputStream(new File(directory+logFile));
            IOUtils.copy(is, response.getOutputStream());
            response.setContentType("application/force-download");
            response.addHeader("Content-Disposition", "attachment; filename="+logFile);
            response.flushBuffer();
        }catch(IOException ex) {
            ex.printStackTrace();
        }
    }

person wisnix    schedule 17.01.2020    source источник


Ответы (2)


Вы используете недопустимый тип контента. Чтобы отправить двоичные данные, которые браузер должен рассматривать как файл (двоичный), вы должны использовать application/octet-stream

Проверьте список типов мультимедиа для получения полного списка допустимого контента. типы для протокола HTTP

person Peter Gyschuk    schedule 17.01.2020
comment
Я пробовал это, это не решает проблему и не объясняет причину. - person wisnix; 17.01.2020
comment
@wisnix Я пытался запустить ваш код без каких-либо изменений, и он у меня работает. Файл загружен. Я думаю, что это может быть связано с конфигурацией браузера. Вы используете Chrome? Пожалуйста, проверьте эти 2 сообщения addictivetips.com/web/ и presentermedia.com/blog/2013/10/ . Может попробовать использовать другой браузер? - person Peter Gyschuk; 17.01.2020
comment
он делает то же самое в Firefox, Edge, Eclipse и Chrome, поэтому я не думаю, что это проблема браузера. - person wisnix; 20.01.2020

Удаление response.flushBuffer(); решило мою проблему.

person wisnix    schedule 20.01.2020