我现在有很多相同的问题,但我找不到答案。
我想在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.');
我试试这段代码,一切正常,但有时候。我不知道为什么有时我的上传文件没有移动到目录,有时它会移动到目录。我尝试使用相同的图像,有时会上传,有时会失败。这很有趣,因为当我上传图像并且它失败时,根本无法捕获任何错误。
答案 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 ?
可能文件大于允许的最大大小。
问候。