I'm trying to asynchronously upload a file to a PHP
website.
The PHP
code reponsible for the upload is:
ini_set ('error_reporting', E_ALL);
ini_set ('display_errors', 1);
ini_set ('display_startup_errors', 1);
echo 'username = ' . `whoami`."\n";
var_dump($_FILES);
$str_name = $_FILES['file']['name'];
echo '$str_name = '.$str_name."\n";
$str_tmp = $_FILES['file']['tmp_name'];
echo '$str_tmp = '.$str_tmp."\n";
$str_tmpdir = substr($_FILES['file']['tmp_name'], 0, strrpos($_FILES['file']['tmp_name'], '/'));
echo '$str_tmpdir = '.$str_tmpdir."\n\n";
echo 'is_dir($str_tmpdir) = '.(is_dir($str_tmpdir) ? 'true' : 'false')."\n\n";
echo 'is_writable($str_tmp) = '.(is_writable($str_tmp) ? 'true' : 'false')."\n\n";
echo 'ini_get("file_uploads") = '.ini_get('file_uploads')."\n\n";
$location = "/Library/WebServer/Documents/pjamesnorris/img/".$str_name;
echo "\n".'move_uploaded_file("'.$_FILES['file']['tmp_name'].'", "'.$location.'")) = '.(move_uploaded_file($_FILES['file']['tmp_name'], $location) ? 'Success' : 'Failure');
and returns the following output:
username = _www
array(1) {
["file"]=>
array(6) {
["name"]=>
string(17) "DantesInferno.jpg"
["full_path"]=>
string(17) "DantesInferno.jpg"
["type"]=>
string(10) "image/jpeg"
["tmp_name"]=>
string(67) "/Library/WebServer/Documents/pjamesnorris/tmp_file_upload/phpRDWjOh"
["error"]=>
int(0)
["size"]=>
int(217602)
}
}
$str_name = DantesInferno.jpg
$str_tmp = /Library/WebServer/Documents/pjamesnorris/tmp_file_upload/phpRDWjOh
$str_tmpdir = /Library/WebServer/Documents/pjamesnorris/tmp_file_upload
is_dir($str_tmpdir) = true
is_writable($str_tmp) = true
ini_get("file_uploads") = 1
<br />
<b>Warning</b>: move_uploaded_file(/Library/WebServer/Documents/pjamesnorris/img/DantesInferno.jpg): Failed to open stream: Permission denied in <b>/Library/WebServer/Documents/pjamesnorris/php/upload.php</b> on line <b>28</b><br />
<br />
<b>Warning</b>: move_uploaded_file(): Unable to move "/Library/WebServer/Documents/pjamesnorris/tmp_file_upload/phpRDWjOh" to "/Library/WebServer/Documents/pjamesnorris/img/DantesInferno.jpg" in <b>/Library/WebServer/Documents/pjamesnorris/php/upload.php</b> on line <b>28</b><br />
move_uploaded_file("/Library/WebServer/Documents/pjamesnorris/tmp_file_upload/phpRDWjOh", "/Library/WebServer/Documents/pjamesnorris/img/DantesInferno.jpg")) = Failure
This PHP
is called by the following javascript
:
async function uploadFile()
{
let formData = new FormData();
formData.append("file", fileupload.files[0]);
await fetch('../php/upload.php',
{
method: "POST",
body: formData
});
alert('The file has been uploaded successfully.');
}
The output above tells me that /Library/WebServer/Documents/pjamesnorris/tmp_file_upload
is writable, and its owner and permissions are:
drwxrwxr-x 2 _www wheel 64 Jun 10 10:35 tmp_file_upload/
Other people seem to have corrected by setting the directory permissions to 0777
but seems like I would be opening myself to security issues, and I've tried it and it had no effect.
I'm at an utter loss as to what the problem is/might be and any help would be appreciated!
The owner of the destination folder, /Library/WebServer/Documents/pjamesnorris/img/
has to be _www
as well!