I. Предисловие
При разработке веб-сайтов часто возникает необходимость в загрузке файлов. Некоторые файлы слишком велики для прямой загрузки, что часто приводит к тому, что процесс загрузки занимает много времени, требует большого объема ресурсов пропускной способности, поэтому загрузка происходит по частям.
Фрагментация загрузка в основном переднего плана будет представлять собой файл большего размера, разделенный на несколько частей, маркировка текущей фрагментации-это количество частей и общее количество частей, пока все фрагменты не будут успешно загружены, в фоновом режиме может быть синтезирован.
II. Проблемы, возникающие в процессе разработки
- Насколько велик размер каждого среза при нарезке? “413 запрос сущности слишком велик”
- При загрузке фрагментов они не загружаются строго в соответствии с серийным номером фрагментов. Как определить, что все фрагменты загружены успешно?
- При синтезе документа, как вы решаете обеспечить, чтобы полный документ был синтезирован без ошибок? При одновременной загрузке нескольких фрагментов чтение и запись файлов без исключительных блокировок могут привести к ошибкам синтеза.
III. Решение проблемы
Когда появилось 413, nginx.conf и php .ini были изменены.
(1) Добавьте client_max_body_size и client_body_buffer_size в nginx
(2) php.ini добавляет post_max_size и upload_max_filesize
Перезагрузите nginx и php-fpm
Логическое расчесывание кода и совместное использование
(1) Сначала получите текущие фрагменты и общее количество фрагментов
(2) Создайте папку для хранения всех фрагментированных и синтезированных файлов
(3) Переменная $done изначально верна, чтобы определить, все ли фрагменты были загружены. При сохранении каждого фрагмента в качестве имени файла используется серийный номер фрагмента, а затем определяется существование всех фрагментированных файлов.
(4) Когда, загрузите все фрагменты от имени завершения, файлы синтеза. _
Переменная $target представляет имя синтезированного файла, file_exists определяет, был ли синтезированный файл успешно синтезирован, а затем дополнительно создает открытый файл, который записывает каждый фрагмент в файл в цикле.
Перед чтением каждого фрагмента необходимо определить, существует ли текущий фрагмент, чтобы предотвратить выполнение несколькими процессами блока кода составного файла, что приведет к записи и удалению фрагмента и, в конечном итоге, к неполному составному файлу. В это время необходимо удалить неполный составной файл и выйти из текущего процесса.
Лучше всего установить эксклюзивную блокировку для каждого фрагмента, flock ($in, LOCK_EX), чтобы гарантировать, что никакой другой процесс не будет управлять фрагментом во время чтения или записи фрагмента. Наконец, удалите фрагмент, разорвите связь и снимите эксклюзивную блокировку.
резюме
Выше упоминался метод реализации загрузки файлов HP в сегментах, представленный Xiaobian. Я надеюсь, что это будет полезно для вас. Если у вас есть какие-либо вопросы, пожалуйста, оставьте мне сообщение. Сяобянь ответит вам вовремя.