Скачать большие файлы с помощью сервиса с потоковой передачей без буферизации браузераJAVA

Программисты JAVA общаются здесь
Anonymous
Скачать большие файлы с помощью сервиса с потоковой передачей без буферизации браузера

Сообщение Anonymous »

Я разрабатываю сервлет Java 8 для загрузки ресурса на молнии. Размер файла может значительно различаться, иногда достигая до 700 МБ. Для тестирования я использую файл ZIP 350 МБ. это. Это приводит к задержке за 30-40 секунд до появления диалога сохранения. «Ланг-ява симпатичный переверт»>

Код: Выделить всё

@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

String strCryptedURL = request.getParameter(DownloadFolderServlet.URL_PARAM_NAME);
String strURL = PasswordUtil.isPasswordEncrypted(strCryptedURL) ? PasswordUtil.decryptPassword(strCryptedURL) : strCryptedURL;

try {
URL url = new URL(strURL);
String userInfo = url.getUserInfo();

if (userInfo == null || !userInfo.contains(":")) {
response.sendError(HttpServletResponse.SC_UNAUTHORIZED, "Missing credentials for WebDAV.");
return;
}

String[] userPass = userInfo.split(":", 2);
String username = userPass[0];
String password = userPass[1];

String sanitizedURL = url.getProtocol() + "://" + url.getHost() + ":" + url.getPort() + url.getPath();

HttpURLConnection fileConn = (HttpURLConnection) new URL(sanitizedURL).openConnection();
fileConn.setRequestMethod("GET");
fileConn.setConnectTimeout(10000);
fileConn.setReadTimeout(60000);

String encodedAuth = Base64.getEncoder().encodeToString((username + ":" + password).getBytes(StandardCharsets.UTF_8));
fileConn.setRequestProperty("Authorization", "Basic " + encodedAuth);

if (fileConn.getResponseCode() != HttpURLConnection.HTTP_OK) {
response.sendError(fileConn.getResponseCode(), "Error retrieving file from WebDAV.");
return;
}

String fileName = url.getPath().substring(url.getPath().lastIndexOf("/") + 1);

response.reset();
response.setContentType("application/octet-stream");
response.setHeader("Content-Disposition", "attachment; filename=\"" + fileName + "\"");
response.setHeader("Content-Transfer-Encoding", "binary");

response.setHeader("Transfer-Encoding", "chunked"); // Tried enabling chunked encoding

response.flushBuffer();

try (InputStream inputStream = fileConn.getInputStream();
OutputStream outputStream = response.getOutputStream()) {

byte[] buffer = new byte[8192]; // 8 KB buffer
int bytesRead;
while ((bytesRead = inputStream.read(buffer)) != -1) {
outputStream.write(buffer, 0, bytesRead);
outputStream.flush(); // Ensuring data is sent immediately
}

}
} catch (Exception e) {
e.printStackTrace();
response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, "Error while downloading the ZIP file.");
}
}
Я пробовал:
  • Настройка передачи передачи: Chunked
  • Обеспечение обеспечения типа контента: приложение /octet-stream < /li>
    Использование flushbuffer () < /li>
    Явно избегая длины контента (до предотвратить буферизацию) Чтобы получить весь файл, который должен быть Моя реализация, которая заставляет браузер на
    buffer все, прежде чем показать подсказку сохранения? доступны?


Подробнее здесь: https://stackoverflow.com/questions/794 ... -buffering

Вернуться в «JAVA»