简体   繁体   中英

PHP move_uploaded_file doesn't work occasionally?

I now there are lots of same questions here, but I didn't find my answer.

I want to upload an image using move_uploaded_file() function in PHP. Here is my logic?

//check if file uploaded
if (!isset($_POST) || !isset($_FILES)) {
    return back();
}

// allowed extensions
$extensions = ['jpg', 'jpeg', 'gif', 'png'];


$fileName = pathinfo($_FILES['profile-image']['name'], PATHINFO_FILENAME);

// save file extension into a variable for later use
$parts =  explode('.',$_FILES['profile-image']['name']);
$extension = strtolower(end($parts));

$fileSize = $_FILES['profile-image']['size'];

// check the extension
if (!in_array($extension, $extensions)) {
    return back()->withErrors(['File Extension is not valid']);
}

// check if file size is less than 2MB
if ($fileSize >= 2e+6) {
    return back()->withErrors(['File Size is too large.']);
}



//check if there is other errors
if ($_FILES['profile-image']['error']) {
    return back()->withErrors(['You have anonymus error']);
}

// generate a unique file name
$profile_image = Hash::make($fileName) . '-' . time() . '.' . $extension;

// make a directory if there isn't one
if (!is_dir('public/img')) {
    mkdir('public/img');
}


// if current user has an image then delete it
$user = App::get('database')->find('users', compact('id'));

if ($user->profile_image) {
    unlink('public/img/' . $user->profile_image);
}


// move image into directory and final check for errors
if( ! move_uploaded_file($_FILES['profile-image']['tmp_name'], 'public/img/' . $profile_image) ) {
    return back()->withErrors(['Your file doesn\'t uploaded']);
}


// Insert Uploaded Image into DB.
App::get('database')->update('users', compact('id'), compact('profile_image'));


return redirect('dashboard')->withMessage('Thank for uploading the file.');

I try this code, everything works properly but just sometimes. I don't know why sometimes my uploaded file doesn't move to the directory and sometimes it does. I tried for the same image, sometimes it uploaded and sometimes it failed. This is interesting, because when I upload an image and it fails, can't catch any errors at all.

Did you check max_file_uploads and post_max_size in your php.ini file ?

Maybe the file is bigger than the maximum size allowed.

Regards.

OK, I find the problem. When I hash the image name and save it to DB, sometimes it includes / inside file name, then when I use the file name in image src attribute, it considers the part before the / as another directory.

It might have trouble with,

  • Your Destination Directory have some writing permission issue .

Try this for manage file permission,

     if (!is_writable($url)) {
        try {
            chmod($url, 0644);
        } catch (Exception $e) {
            die($e->getMessage() . ' | File : ' . $url . ' | Needs write permission [0644] to process !');
        }
    }

All the Best !

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM