Один из самых безопасных способов сделать это - загрузить файлы с временным именем и переименовать их после завершения передачи. Ваша программа должна пропускать файлы с временным именем (простое расширение работает просто отлично.) Очевидно, что для взаимодействия требуется клиент (загрузчик), поэтому это не идеально.
[Это также позволяет вам удалить неудачные (частичные) передачи по истечении заданного периода времени, если вам это нужно.]
Все, что основано на опросе размера файла, является ненадежным и небезопасным.
Другая схема (которая также требует сотрудничества с загрузчиком) может включать загрузку сначала хеша и размера файла, а затем самого файла. Это позволяет вам знать как когда передача сделана, так и согласована ли она. (Существует множество вариантов этой идеи.)
Что-то, что не требует взаимодействия с клиентом, проверяет, открыт ли файл другим процессом или нет. (То, как вы это делаете, зависит от ОС - я не знаю встроенного PHP, который делает это. lsof
и / или fuser
можно использовать на различных платформах типа Unix, для этого в Windows есть API.) Если файл открыт у другого процесса, скорее всего, он еще не завершен.
Обратите внимание, что этот последний подход может быть небезопасным, если вы разрешаете перезапуск / возобновление загрузки или если программное обеспечение вашего FTP-сервера не сохраняет файл открытым в течение всего времени передачи, поэтому YMMV.