|
php.net | support | documentation | report a bug | advanced search | search howto | statistics | random bug | login |
PatchesPull RequestsHistoryAllCommentsChangesGit/SVN commits
[2003-03-01 11:36 UTC] wez@php.net
[2003-03-01 20:06 UTC] kemal at thelimelight dot nl
[2003-03-02 03:49 UTC] kemal at thelimelight dot nl
[2003-03-02 05:18 UTC] wez@php.net
[2003-03-17 10:19 UTC] kemal at thelimelight dot nl
[2012-05-18 14:25 UTC] ajes2kemais at gmail dot com
-: kemal@thelimelight.nl
+: ajes2kemais at gmail dot com
-Package: Filesystem function related
+Package: *General Issues
[2012-05-23 23:53 UTC] felipe@php.net
-Status: Closed
+Status: Open
[2012-05-23 23:56 UTC] felipe@php.net
-Status: Open
+Status: Closed
-Assigned To:
+Assigned To: felipe
|
|||||||||||||||||||||||||||
Copyright © 2001-2025 The PHP GroupAll rights reserved. |
Last updated: Mon Dec 08 14:00:02 2025 UTC |
(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 (!@move_uploaded_file($temp, $target) and $n<100) { clearstatcache(); sleep(1); $n++; }