Мой брат сделал сетевой диск и он взорвался!

задняя часть Архитектура

Гениальный дизайн функции загрузки файлов

Всем привет, я Fish Skin.

Я не знаю, задумывались ли вы когда-нибудь о создании собственного сетевого диска? Нет, мой брат Аба, который изучал программирование, сделал один и был очень рад прийти и попробовать его.

Открываю сетевой диск, интерфейс не плохой, просто пробовал загружать и скачивать файлы, проблем нет.

阿巴网盘

Пока маленький Аба был самодовольным, я попытался загрузить файл размером 1 ГБ. Когда результирующий файл заливается на 99%, сеть трясется, загрузка файла не проходит, и приходится заново заливать с 0? !

Маленький Аба беспомощно почесал затылок: Сеть плохая, ты меня винишь?

Я прям влепил, знаете ли, сделать сетевой диск задача не из легких!

Начиная с самых основных функций, необходимо реализовать загрузку файлов, хранение, загрузку, управление файлами и каталогами. Если вы действительно хотите выйти в интернет и открыть его для других, вы также должны учитывать управление разрешениями, доступ к интерфейсу и ускорение CDN, поскольку делать это самостоятельно очень проблематично.

Поэтому в дополнение к обучению, если вы хотите создать свой собственный частный сетевой диск, рекомендуется выбрать несколько дисков с открытым исходным кодом, таких как основные Seafile, Nextcloud, Cloudreve, OwnCloud.

Конечно, самое важное в общедоступных сетевых дисках — это стоимость ресурсов, таких как полоса пропускания и хранилище, поэтому для экономии затрат и поддержки большего количества пользователей многие сетевые диски используют стратегии ограничения скорости и емкости.

Сяо Аба: Сделать сетевой диск так хлопотно, я сдаюсь, сдаюсь. . .

Я рассмеялся: «Хотя сделать хороший сетевой диск сложно, мы можем делать это шаг за шагом и изучать превосходный дизайн в каждой функции, и я верю, что мы, наконец, сможем сделать хороший сетевой диск». Начните сегодняФайл загруженДавайте поговорим об этом, решите проблему, что загрузка только что не удалась и ее необходимо повторно загрузить с 0.

дизайн загрузки файлов

Загрузка файлов, как следует из названия, заключается в отправке файлов с локального компьютера на удаленный сервер, где файлы хранятся, про загрузку маленьких файлов и говорить нечего, основное внимание уделяется тому, как загружать большие файлы.Быстрее, стабильнее, гибче и отзывчивееИ так далее, чтобы улучшить пользовательский опыт.

Вот некоторые классические схемы загрузки больших файлов, включая фрагментацию файлов, параллельную загрузку, возобновление точки останова, вторую загрузку и асинхронную загрузку.

фрагментация файлов

Поскольку обработка небольших файлов относительно проста, вы также можете разделить большой файл на несколько последовательных небольших файлов и отправить их по частям перед отправкой.

文件分块

Кроме того, при отправке каждого блока файла необходимо передавать дополнительную информацию, такую ​​как текущее количество блоков, общее количество блоков в файле, размер файла, исходный идентификатор файла (MD5) и т. д.:

Таким образом, сервер может получать фрагменты файлов и сохранять эти фрагменты во временный каталог. Когда последний блок получен, все предыдущие блоки файла соединяются вместе, чтобы сформировать завершенный исходный файл.

одновременная загрузка

После того, как большой файл разбит на части, его можно загрузить одновременно через несколько потоков, передавая несколько частей одновременно:

串行上传和并发上传

Необходимо решить, следует ли загружать одновременно и сколько блоков загружать одновременно, в зависимости от условий сети.Чем больше одновременно, тем лучше. Если сеть исправна, увеличение количества одновременных файлов может значительно повысить общую эффективность загрузки файлов; напротив, слепая настройка количества одновременных файлов может привести к замедлению загрузки.

http

Для больших файлов, если загрузка прерывается и ретрансляция начинается с 0, это слишком неприятно!

Рекомендуется использовать технологию возобновления с точки останова.Принцип очень прост.На основе сегментации файла сервер записывает ход загрузки, соответствующий исходному файлу, и обновляет прогресс каждый раз, когда получен блок. Таким образом, даже если загрузка не удалась из-за сбоя сети, вы можете узнать из хода загрузки, какие фрагменты файла были загружены и какой фрагмент необходимо перезапустить следующим, без необходимости повторной передачи с первого фрагмента.

断点续传

Тот же принцип применим и к загрузке файлов.

Существует множество способов реализации возобновления с точки останова, например, самостоятельная реализация, протокол HTTP 1.1 и т. д. Заинтересованные студенты могут узнать об этом.

второй проход

Не знаю, замечали ли вы, что иногда мы можем загрузить огромный файл в несколько гигабайт за 1 секунду!

Как это достигается? Правда одна, и файл должен быть загружен раньше!

Это классическая технология второго прохода.

Перед загрузкой файла сначала вычислите значение MD5 файла на клиенте (например, в браузере) в соответствии с содержимым файла.Значение MD5 файла с тем же содержимым должно быть одинаковым. Затем проверьте, существует ли файл, соответствующий MD5, в базе данных загруженных файлов сервера. Если он не существует, загрузите файл и вставьте информацию о файле в базу данных после успешной загрузки.Процесс выглядит следующим образом:

文件秒传 - 文件不存在

Если файл уже существует, просто создайте новую ссылку на файл, не загружая его повторно.Процесс выглядит следующим образом:

文件秒传 - 文件已存在

Однако следует отметить, что значения MD5 разных файлов контента также могут быть одинаковыми (коллизия), в результате чего пользователь загружает файл, который не был загружен им самим, поэтому при повторной проверке может быть некоторая проверка. добавлены, например генерация MD5 для первых нескольких цифр файла. , Использование других алгоритмов хеширования для генерации контрольного значения и т. д.

Асинхронная загрузка

В дополнение к синхронной загрузке, когда файл, который мы хотим загрузить, не является локальным, но соответствующий URL-адрес уже существует, мы также можем использоватьПолностью асинхронная загрузкаспособ превратить загрузку файла вЗадача.

После того, как пользователь вводит URL-адрес загружаемого файла и нажимает кнопку «Загрузить», ему не нужно все время ждать на странице загрузки файла. новая задача загрузки файла в фоновом режиме для быстрого ответа пользователю, например, «Файл загружается, обратите внимание на уведомление». После того, как фон снят и задача загрузки файла фактически выполнена, достаточно отправить уведомление пользователю.

Общие шаги следующие:

异步上传


Наконец, если вам нужно использовать загрузку файлов только в процессе разработки, вам не нужно реализовывать вышеуказанные функции самостоятельно, просто используйте готовый сервис хранения объектов. Например, Qiniuyun, мы сделали все для загрузки чанками, вы также можете обратиться к документации Qiniuyun SDK (github.com/qiniu), чтобы узнать о них…

Я рыбья кожа, я дам тебе немного в концеПомогите мне получить учебные материалы, предлагаемые Dachang:

Убегай, оставив 6т ресурсов!

добро пожаловать на чтениеЯ начал обучение программированию, стажировку, поиск работы, сертификацию и опыт написания книг в Tencent с нуля, и меня это больше не смущает!

Я изучаю компьютер уже четыре года, давайте друг друга подбадривать!

Выше это сообщение об этой проблеме, если это поможет, пожалуйста, поставьте лайк ❤️