#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();