Вопрос проверяет понимание механизмов надежной передачи файлов и умение реализовать возобновляемую загрузку, что критично для приложений, работающих с большими файлами или в нестабильных сетях.
Реализация докачки (resumable upload/download) — это важная функциональность для повышения надежности передачи файлов, особенно в условиях нестабильного интернет-соединения или при работе с большими объемами данных. Основная идея заключается в том, чтобы разбить файл на управляемые части (чанки) и иметь возможность продолжить передачу с места разрыва, а не начинать заново.
В основе часто лежит протокол HTTP и его спецификация заголовков:
Range: bytes=500-999).Accept-Ranges: bytes.Content-Range: bytes 500-999/1500).Для загрузки файла на сервер подход может быть таким:
Ниже приведен упрощенный пример, демонстрирующий логику возобновляемой загрузки с использованием Fetch API и контроля прогресса.
async function resumeUpload(file, uploadUrl) {
// 1. Получаем с сервера уже загруженный размер
const statusResponse = await fetch(`${uploadUrl}/status?fileId=${file.name}`);
const { uploadedSize } = await statusResponse.json();
// 2. Открываем файл для чтения с нужной позиции
const chunkSize = 1024 * 1024; // 1 MB
let startByte = uploadedSize;
while (startByte < file.size) {
const chunk = file.slice(startByte, startByte + chunkSize);
const formData = new FormData();
formData.append('chunk', chunk);
formData.append('fileId', file.name);
formData.append('startByte', startByte.toString());
try {
const response = await fetch(uploadUrl, {
method: 'POST',
body: formData,
});
if (!response.ok) throw new Error('Upload failed');
// 3. Обновляем прогресс после успешной отправки чанка
startByte += chunk.size;
console.log(`Uploaded ${startByte} of ${file.size} bytes`);
} catch (error) {
console.error('Chunk upload failed, will retry:', error);
// Здесь можно добавить логику повторных попыток
break;
}
}
if (startByte >= file.size) {
console.log('File upload completed!');
}
}Докачка широко используется в облачных хранилищах (Google Drive, Dropbox), торрент-клиентах, системах резервного копирования, стриминговых сервисах для видео и в любых корпоративных приложениях, где передаются большие файлы (логи, архивы, медиафайлы).
Вывод: Реализация докачки необходима для создания отказоустойчивых и пользовательских приложений, работающих с файлами. Её стоит применять всегда, когда есть риск обрыва соединения или когда размер передаваемых данных значителен, чтобы экономить трафик и время пользователя.