Una de las formas más seguras de hacerlo es subir los archivos con un nombre temporal y cambiarles el nombre una vez la transferencia ha terminado. Su programa debe omitir archivos con el nombre temporal (una simple extensión funciona bien). Obviamente, esto requiere que el cliente (cargador) coopere, por lo que no es ideal.
[Esto también le permite borrar las transferencias fallidas (parciales) después de un período de tiempo determinado si necesita eso.]
Cualquier cosa basado en el sondeo del tamaño del archivo es subido de tono e inseguro.
Otro esquema (que también requiere la cooperación del cargador) puede implicar cargar primero el hash y el tamaño del archivo, luego el archivo real. Eso le permite saber cuándo se realiza la transferencia y si es coherente. (Hay muchas variantes en torno a esta idea.)
Algo que no requiere cooperación del cliente es comprobar si el archivo está abierto por otro proceso o no. (Cómo lo hace es dependiente del sistema operativo - No sé de un PHP incorporado que hace esto. lsof
y/o fuser
se puede utilizar en una variedad de plataformas de tipo Unix, Windows tiene API para esto.) Si otro proceso tiene el archivo abierto, es probable que aún no esté completo.
Tenga en cuenta que este último enfoque puede no ser infalible si permite reiniciar/reanudar cargas, o si el software del servidor FTP no mantiene el archivo abierto durante toda la transferencia, entonces YMMV.
Hmm, interesante cuestión de hecho! +1 –
Puede usar [ftp_nb_put] (http://nl3.php.net/manual/en/function.ftp-nb-put.php), ver ejemplo con while-loop en el documento. –
cheque por Linux usando exec como 'lsof | grep filename ' –