PHP move_uploaded_file偶尔不起作用?

时间:2016-12-28 13:09:09

标签: php

我现在有很多相同的问题,但我找不到答案。

我想在PHP中使用 move_uploaded_file()函数上传图像。这是我的逻辑?

//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.');

我试试这段代码,一切正常,但有时候。我不知道为什么有时我的上传文件没有移动到目录,有时它会移动到目录。我尝试使用相同的图像,有时会上传,有时会失败。这很有趣,因为当我上传图像并且它失败时,根本无法捕获任何错误。

3 个答案:

答案 0 :(得分:1)

好的,我发现了问题。当我散列图像名称并将其保存到DB时,有时它在文件名中包含 / ,然后当我在图像 src 属性中使用文件名时,它会考虑该部分在/作为另一个目录之前。

答案 1 :(得分:0)

可能有问题,

  • 您的目标目录有一些写入权限问题

尝试此操作以管理文件权限,

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

一切顺利!

答案 2 :(得分:0)

您是否在php.ini文件中检查了 max_file_uploads post_max_size

可能文件大于允许的最大大小。

问候。