ID: 22488 User updated by: kemal at thelimelight dot nl Reported By: kemal at thelimelight dot nl -Status: Feedback +Status: Open Bug Type: Filesystem function related Operating System: Windows NT 4.0 SP6 PHP Version: 4.2.3 New Comment:
**** Additional test done with PHP 4.3.2-dev (build date Mar 2 2003 02:16:38): same result as with previous versions. Previous Comments: ------------------------------------------------------------------------ [2003-03-01 11:36:26] [EMAIL PROTECTED] Please try using this CVS snapshot: http://snaps.php.net/php4-STABLE-latest.tar.gz For Windows: http://snaps.php.net/win32/php4-win32-STABLE-latest.zip ------------------------------------------------------------------------ [2003-03-01 10:18:27] kemal at thelimelight dot nl (I have tested this with PHP 4.2.3 and PHP 4.3.1 running as a CGI process under IIS 4 on NT4-SP6 server with FAT file system) The situation: After receiving a submission from an HTML form which includes an uploaded file, I need to move the uploaded file from its temporary place to its final place. The problem: Whenever the target location already have a file with the same name, the PHP command would fail with either 'unable to create' and/or 'permission denied' type of warnings. It does not matter whether I use one simple move_uploaded_file() function or a combination of unlink(), copy() and rename() functions. It even fails when I use the system() or exec() function. Please remember that the existing file is not marked 'read-only' and the user account (I_USR) does have write capability on the intended directory. I have already tried using double backward slash as path separator (instead of forward slash), using full path to root of drive (instead of relative), giving I_USR account administrator priviledges, sharing the target directory, moving temp directory to the same drive as the target directory, disabling warning message generation (using the @ prefix), trying to unlink or move the files using multiple strategy one after the other, etc. Interesting behaviour: The PHP commands would not always fail. Once in a while, it would succeed. Espescially after the script has died. (Seems to react differently when there is a time lapse) **** SAMPLE SCRIPT FOR BUG TESTING: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <html> <head> <title>upload test</title> <META HTTP-EQUIV="PRAGMA" CONTENT="no-cache"> <META HTTP-EQUIV="expires" CONTENT="Fri, 1 January 1999 12:00:00 EST"> </head> <body> <form method="post" enctype="multipart/form-data"> <input type="hidden" name="MAX_FILE_SIZE" value="65536"> <?php $vname = 'myfile'; $target = './my_uploaded_image.jpg'; $name = $_FILES[$vname]['name']; $type = $_FILES[$vname]['type']; $size = $_FILES[$vname]['size']; $temp = $_FILES[$vname]['tmp_name']; $err = $_FILES[$vname]['error']; if (is_uploaded_file($temp)) { if (!move_uploaded_file($temp, $target)) { echo "<strong>Error:</strong> Unable to accept file $name<br>"; } } if (is_file($target)) { echo sprintf('<img src="%s" border="0">', $target); } else { echo "(no image file)"; } ?><br> Specify here an jpeg image file to be uploaded:<br> <input type="file" name="<?php echo $vname; ?>"><br> <input type="Submit" value="Upload"> </form> </body> </html> **** WORK AROUND THAT SEEMS TO WORK: change the simple move_uploaded_file() invocation to: $n = 0; while ([EMAIL PROTECTED]($temp, $target) and $n<100) { clearstatcache(); sleep(1); $n++; } ------------------------------------------------------------------------ -- Edit this bug report at http://bugs.php.net/?id=22488&edit=1
