Здесь есть одна проблема:
int fileLength = inputStream.available();
available () не возвращает общее количество байтов в потоке.Он просто возвращает количество байтов, которые можно прочитать без блокировки.Из документации :
Обратите внимание, что хотя некоторые реализации InputStream
будут возвращать общее количество байтов в потоке, многие не будут. Никогда не правильно использовать возвращаемое значение этого метода для выделения буфера, предназначенного для хранения всех данных в этом потоке.
Использование Blob.length () вместо:
long fileLength = blob.length();
// ...
response.setContentLengthLong(fileLength);
Другая проблема - ваша обработка ошибок.Не действуйте так, как метод удался, если он не удался.Вы хотите HTTP-вызов для возврата ошибки, если ваш метод не смог успешно получить файл.
Сначала удалите блок catch (IOException ex)
.Если существует IOException, вы хотите, чтобы он распространялся, поэтому HTTP-вызов не будет выполнен должным образом.
Другие два блока должны распространять свои ошибки:
} catch (SQLException ex) {
throw new ServletException(ex);
} catch (ClassNotFoundException e) {
throw new ServletException(e);
Аналогично, выхотите сделать больше, чем просто напечатать «Файл не найден», когда ResultSet пуст.Существует код ответа HTTP, предназначенный специально для указания того, что запрос HTTP не выполнен, поскольку запрошенный ресурс не найден:
if (result.next()) {
// ...
} else {
response.setStatus(HttpServletResponse.SC_NOT_FOUND);
response.getWriter().print("File not found for the file id: " + course_code);
}