共享主机问题 - 没有根目录访问 - 文件上载

When I tried uploading to /non_public_html/ the support team from my hosting team said that:

. Unfortunately, I have some bad news. It seems that you will not be able to move that file through a script, because of shared hosting restrictions. In order to have "www-data" permissions you would need to have a VPS package, so you could get root permissions.

So I can't upload to outside of /public_html/ it seems.

However when I try to upload to public_html it still fails, this is my code:

$PICTURE_UPLOAD_DIR = '/public_html/my_uploaded/';
$PICTURE_MIMES = [
    'jpg' => 'image/jpeg',
    'png' => 'image/png'
];

$image = $_FILES['image'];
$imagepath = $image['tmp_name'];

// Undefined | Multiple Files | $_FILES Corruption Attack
// If this request falls under any of them, treat it invalid.
if (!isset($image['error']) || is_array($image['error'])) {
    $ojson['error'] = 'Invalid parameters'; $finish();
}

// Check $image['error'] value.
switch ($image['error']) {
    case UPLOAD_ERR_OK:
        break;
    case UPLOAD_ERR_NO_FILE:
            $ojson['error'] = 'No file sent'; $finish();
    case UPLOAD_ERR_INI_SIZE:
    case UPLOAD_ERR_FORM_SIZE:
        $ojson['error'] = 'Exceeded filesize limit.'; $finish();
    default:
        $ojson['error'] = 'Unknown errors.'; $finish();
}

// You should also check filesize here.
$size = filesize($imagepath);
// $size = $image['size']; // dont trust $_FILES
if ($size > 1000000) {
    $ojson['error'] = 'Exceeded filesize limit.'; $finish();
}

// DO NOT TRUST $_FILES['image']['mime'] VALUE !!
// Check MIME Type by yourself.
$finfo = new finfo(FILEINFO_MIME_TYPE);
$mime = $finfo->file($imagepath);
// if ($ext = array_search($mime, $PICTURE_MIMES) === false) { // this doesnt set $ext
if (false === $ext = array_search($mime, $PICTURE_MIMES)) {
    $ojson['error'] = 'Invalid file format.'; $finish();
}
$ojson['$ext'] = $ext;
$ojson['$mime'] = $mime;

// generate random file name
while (true) {
    $filename = generateRandomString().'.'.$ext;
    $pathtarget = $PICTURE_UPLOAD_DIR.$filename;
    if (!file_exists($pathtarget)) break;
}
$ojson['$pathtarget'] = $pathtarget;
$ojson['$imagepath'] = $imagepath;

// $getimg = getimagesize($imagepath);

if(is_uploaded_file($imagepath)){
    $ojson['isuploaded'] = true;
} else {
    $ojson['NOTUPLOADED'] = true;
}

if(move_uploaded_file($imagepath, $pathtarget)) {
    $ojson['ok move'] = 'ok';
} else {
    $ojson['failed move'] = error_get_last();
}

move_uploaded_file continually fails, and error_get_last() is always printing:

move_uploaded_file(): Unable to move '/tmp/php7G5KMy' to '/public_html/my_uploaded/Q9BEsUkDre.jpg'

isuploaded is always true. I am so confused, may you please help.