Один из самых безопасных способов сделать это - загрузить файлы с временным именем и переименовать их после передача завершена. Программа должна пропускать файлы с временным именем (простое расширение работает очень хорошо.) Очевидно, для этого требуется, чтобы клиент (загрузчик) сотрудничал, поэтому он не идеален.
[Это также позволяет удалять неудачные (частичные) переводы по истечению определенного периода времени, если вам нужно.]
Anything, основанного на опросе размер файла является колоритным и небезопасным.
Другая схема (которая также требует сотрудничества от загрузчика) может включать сначала загрузку хэша и размера файла, а затем фактический файл. Это позволяет вам знать, когда это делается, и если это согласовано. (Существует много вариантов этой идеи.)
Что-то, что не требует сотрудничества от клиента, проверяет, открыт ли файл другим процессом или нет. (Как вы это делаете, зависит от ОС). Я не знаю встроенного PHP, который делает это. lsof
и/или fuser
могут использоваться на разных платформах Unix, для Windows для этого есть API.) Если другой процесс имеет файл открыт, скорее всего, он еще не завершен.
Обратите внимание, что этот последний подход не может быть безупречным, если вы разрешаете перезапуск/возобновление загрузки или если ваше программное обеспечение FTP-сервера не сохраняет файл открытым в течение всей продолжительности передачи, поэтому YMMV.
Хм, интересный вопрос, на самом деле! +1 –
Вы можете использовать [ftp_nb_put] (http://nl3.php.net/manual/en/function.ftp-nb-put.php), см. Пример с while-loop в документе. –
check by linux с помощью exec как 'lsof | grep filename ' –