Большой файл загружается несколько минут, а после обрыва пользователь вынужден начинать заново. Одновременно приложение держит весь файл в памяти и считает расширение достаточной проверкой. Надежный поток разделяет прием байтов, проверку и публикацию готового объекта.
Что подготовить
- Разрешенные типы и размеры, правила доступа и срок хранения незавершенных загрузок.
- Ожидаемая параллельность, ограничения памяти и доступное хранилище.
- Сценарии отмены, повторного запроса, проверки содержимого и последующей обработки.
Порядок работы
- Присвойте загрузке устойчивый идентификатор и сохраняйте данные в непубличном промежуточном состоянии.
- Передавайте содержимое потоком с ограничением объема; не полагайтесь только на объявленный размер запроса.
- Проверяйте фактический формат и разрешенные характеристики. Имя пользователя храните как метаданные, а не как доверенный путь.
- Для возобновляемой загрузки фиксируйте подтвержденные части, их порядок и контроль целостности. Повтор части должен иметь определенное поведение.
- Публикуйте файл только после всех проверок и завершения обработки. Удаляйте просроченные незавершенные объекты отдельной контролируемой процедурой.
Разобранный пример
Файл разбит на пять частей. Третья часть отправлена дважды после потери ответа. Сервер связывает номер части с идентификатором загрузки и контрольным значением, подтверждает одинаковый повтор и отклоняет противоречащие байты. Завершение проверяет наличие всех частей и итоговый размер.
Как проверить результат
- Файл сверх лимита прекращает прием без неконтролируемого потребления памяти.
- Прерванная загрузка не доступна как готовый объект.
- Повтор завершения не создает второй файл и не запускает обработку повторно без необходимости.
Если что-то пошло не так
При сбое проверки оставьте понятный статус и удалите промежуточные данные по политике хранения. Если часть принята, но подтверждение потеряно, сверяйте ее идентичность перед повтором. Не склеивайте куски только по порядку прихода сетевых запросов.
Проверка частей и завершения загрузки
Опишите запись загрузки: владелец, ожидаемый размер, подтвержденные части, срок хранения и текущее состояние. Номер части должен интерпретироваться только внутри конкретной загрузки. Иначе два пользователя, одновременно отправившие третью часть разных файлов, могут столкнуться на общем имени. Проверяйте принадлежность при каждом запросе продолжения, а не только при создании загрузки.
Для каждой части различайте три случая: новая часть, точный повтор и повтор с другим содержимым. Первый сохраняется, второй подтверждается согласно контракту, третий требует явного конфликта или согласованной замены. Во время завершения нельзя считать файл готовым только по количеству частей: проверьте их номера, размеры и итоговую последовательность.
В приемочную подборку включите отмену после последней части, два одновременных запроса завершения и очистку просроченной загрузки во время активного продолжения. Политика владения должна определить, кто имеет право завершать или удалять объект в такой ситуации. Пользовательский статус должен различать передачу байтов и последующую проверку: достигнутые сто процентов отправки еще не означают, что файл принят и доступен. Сохраните отдельный идентификатор результата, чтобы завершенный объект можно было найти после повторного открытия страницы.
Промпт для разбора ваших материалов
Разработай состояния загрузки по требованиям. Опиши потоковое ограничение ресурсов, проверку формата, повтор частей, публикацию и очистку. Добавь тесты обрыва, неверного размера и двойного завершения без предположений о конкретном провайдере хранилища.Частые вопросы
Достаточно ли проверить расширение?
Нет. Оно задается клиентом и не подтверждает фактическое содержимое файла.
Когда файл можно показывать другим пользователям?
После завершения предусмотренных проверок и перехода в готовое состояние с применением правил доступа.
Материал библиотеки решений Ильи Тарасова / TarasovWeb.
О проекте
Практическая библиотека Ильи Тарасова и TarasovWeb. Telegram-канал · Личная страница · ВКонтакте.
#tarasovweb #ИльяТарасов
