Загрузка файла Excel из spring java приводит к повреждению файла

#java #spring #servlets

#java #весна #сервлеты

Вопрос:

Я пытаюсь вызвать этот метод из своего фильтра, и я успешно могу загрузить Excel, но после загрузки, когда я открываю excel, он показывает, что он поврежден, но когда я вижу, что файл на сервере files открывается нормально без каких-либо ошибок.

Ошибка Excel: Excel не может открыть файл «filename», поскольку формат файла или расширение файла недопустимы.

 public static void downloadFileFromServer(HttpServletResponse response, String sourceFile,
            Boolean isFilenameHavingTimestamp,Boolean deleteTempFile) throws IOException, Exception {
        logger.debug("Inside ServiceUtils.downloadFileFromServer()");
        // splitting serverPath and fileName
        String serverHomeDirectory[] = sourceFile.split("\\|/");
        String fileName = serverHomeDirectory[serverHomeDirectory.length - 1];
        fileName = URLDecoder.decode(fileName, "UTF-8");
        if (Boolean.TRUE.equals(isFilenameHavingTimestamp)) {
            fileName = removeTimestampFromFilename(fileName);
        }

        response.setContentType("application/octet-stream");
        response.addHeader("content-disposition", "attachment; filename=""   fileName   """);
        try (ServletOutputStream out = response.getOutputStream();
                FileInputStream in = new FileInputStream(sourceFile);) {
            int octet = 0;
            while ((octet = in.read()) != -1) {
                out.write(octet);
            }
            
        } catch (Exception e) {
            logger.error("Exception in ServiceUtils.downloadFileFromServer(): ", e);
            throw new Exception(ExceptionMessage.ERROR_DOWNLOAD_EXCEL_FILE);
        } finally {
            
            // check if file needs to be deleted after download
            /*if(deleteTempFile)
                deleteTempFile(sourceFile);*/
        }
    }
  

Ответ №1:

Проблема заключалась в том, что в ответе уже была строка, и код записывал файл, добавляя существующий ответ в буфер.

Решена проблема путем добавления кода ниже перед setContentType()

 response.reset();