MinhNP
(Member)
[Off] 14-08-2016 |
Upload hình ảnh là chức năng hiển nhiên mà bất cứ forum hay blog nào cũng cần tới !
nhưng để có 1 trang upload an toàn thì lại khác ! hiện nay các bạn share mình thấy nhiều cái ko ổn !
nói thế ko có nghĩ là code mình hoàn hảo ! chỉ là có 1 chút cũng gọi là tiện hơn thôi ! ahihi
vào vấn đề : code Này mình post cho johncms nhé !
<?php
defined('_IN_JOHNCMS') or die('Error: restricted access');
require('../incfiles/head.php');
if (!$id || !$user_id) {
echo functions::display_error($lng['error_wrong_data']);
require('../incfiles/end.php');
exit;
}
$id = $_GET['id];
$req = mysql_query("SELECT * FROM `forum` WHERE `id` = '$id'");
$res = mysql_fetch_assoc($req);
$req2 = mysql_query("SELECT * FROM `forum` WHERE `id` = '" . $res['refid'] . "'");
$res2 = mysql_fetch_array($req2);
$req3 = mysql_query("SELECT * FROM `forum` WHERE `id` = '" . $res2['refid'] . "'");
$res3 = mysql_fetch_array($req3);
/// tu đây trở lên là cua johncms hết nhé !
if($_SERVER['REQUEST_METHOD'] == 'POST') {
if(isset($_FILES['image'])) {
// Tao mot array trong cho bien errors
$errors = array();
// Tao mot array, de kiem tra xem file upload co thuoc dang cho phep
$allowed = array('image/jpeg', 'image/jpg', 'image/png', 'images/x-png');
// Kiem tra xem file upload co nam trong dinh dang cho phep
if(in_array(strtolower($_FILES['image']['type']), $allowed)) {
// Neu co trong dinh dang cho phep, tach lay phan mo rong
$ext = end(explode('.', $_FILES['image']['name']));
$renamed = uniqid(rand(), true).'.'."$ext";
if(!move_uploaded_file($_FILES['image']['tmp_name'], "/upload/forum/".$renamed)) {
$errors[] = "<p class='error'>Server problem</p>";
} else {
echo "UPLOAD thanh cong !";
}
} else {
// FIle upload khong thuoc dinh dang cho phep
$errors[] = "<p class='error'>dinh dang file khong hop le - your file is not a valid type</p>";
}
} // END isset $_FILES
// Check for an error
if($_FILES['image']['error'] > 0) {
$errors[] = "<p class='error'>The file could not be uploaded because: <strong>";
// Print the message based on the error
switch ($_FILES['image']['error']) {
case 1:
$errors[] .= "loi tu he thong file php.ini";
break;
case 2:
$errors[] .= "file size qua gioi han form";
break;
case 3:
$errors[] .= "upload ko đủ";
break;
case 4:
$errors[] .= "ko co file";
break;
case 6:
$errors[] .= "file ko tồn tai";
break;
case 7:
$errors[] .= "CHMOD ko hop le";
break;
case 8:
$errors[] .= "su co upload";
break;
default:
$errors[] .= "loi he thong !.";
break;
} // END of switch
$errors[] .= "</strong></p>";
} // END of error IF
// Xoa file da duoc upload va ton tai trong thu muc tam
if(isset($_FILES['image']['tmp_name']) && is_file($_FILES['image']['tmp_name']) && file_exists($_FILES['image']['tmp_name'])) {
unlink($_FILES['image']['tmp_name']);
}
} // END main if
if(empty($errors)) {
// Update cSDL /// an uoload nay la cua johncms
mysql_query("INSERT INTO `cms_forum_files` SET
`cat` = '" . $res3['refid'] . "',
`subcat` = '" . $res2['refid'] . "',
`topic` = '" . $res['refid'] . "',
`post` = '$id',
`time` = '" . $time . "',
`filename` = '" . mysql_real_escape_string($renamed) . "',
`filetype` = '".$_FILES['type']."'
");
//// tao csdl thanh cong thì nen directo ng dung
}
?>
<form enctype="multipart/form-data" action="" method="post">
<fieldset>
<legend>Avatar</legend>
<div>
<img class="avatar" src="uploads/images/<?php echo (is_null($user['avatar']) ? "no_avatar.jpg" : $user['avatar']); ?>" alt="avatar" />
<p>Please select a JPEG or PNG image of 512Kb or smaller to use as avatar<p>
</label>
<input type="hidden" name="MAX_FILE_SIZE" value="524288" />
<input type="file" name="image" />
<p><input class="change" type="submit" name="upload" value="Save changes" /></p>
</div>
</fieldset>
</form>
defined('_IN_JOHNCMS') or die('Error: restricted access');
require('../incfiles/head.php');
if (!$id || !$user_id) {
echo functions::display_error($lng['error_wrong_data']);
require('../incfiles/end.php');
exit;
}
$id = $_GET['id];
$req = mysql_query("SELECT * FROM `forum` WHERE `id` = '$id'");
$res = mysql_fetch_assoc($req);
$req2 = mysql_query("SELECT * FROM `forum` WHERE `id` = '" . $res['refid'] . "'");
$res2 = mysql_fetch_array($req2);
$req3 = mysql_query("SELECT * FROM `forum` WHERE `id` = '" . $res2['refid'] . "'");
$res3 = mysql_fetch_array($req3);
/// tu đây trở lên là cua johncms hết nhé !
if($_SERVER['REQUEST_METHOD'] == 'POST') {
if(isset($_FILES['image'])) {
// Tao mot array trong cho bien errors
$errors = array();
// Tao mot array, de kiem tra xem file upload co thuoc dang cho phep
$allowed = array('image/jpeg', 'image/jpg', 'image/png', 'images/x-png');
// Kiem tra xem file upload co nam trong dinh dang cho phep
if(in_array(strtolower($_FILES['image']['type']), $allowed)) {
// Neu co trong dinh dang cho phep, tach lay phan mo rong
$ext = end(explode('.', $_FILES['image']['name']));
$renamed = uniqid(rand(), true).'.'."$ext";
if(!move_uploaded_file($_FILES['image']['tmp_name'], "/upload/forum/".$renamed)) {
$errors[] = "<p class='error'>Server problem</p>";
} else {
echo "UPLOAD thanh cong !";
}
} else {
// FIle upload khong thuoc dinh dang cho phep
$errors[] = "<p class='error'>dinh dang file khong hop le - your file is not a valid type</p>";
}
} // END isset $_FILES
// Check for an error
if($_FILES['image']['error'] > 0) {
$errors[] = "<p class='error'>The file could not be uploaded because: <strong>";
// Print the message based on the error
switch ($_FILES['image']['error']) {
case 1:
$errors[] .= "loi tu he thong file php.ini";
break;
case 2:
$errors[] .= "file size qua gioi han form";
break;
case 3:
$errors[] .= "upload ko đủ";
break;
case 4:
$errors[] .= "ko co file";
break;
case 6:
$errors[] .= "file ko tồn tai";
break;
case 7:
$errors[] .= "CHMOD ko hop le";
break;
case 8:
$errors[] .= "su co upload";
break;
default:
$errors[] .= "loi he thong !.";
break;
} // END of switch
$errors[] .= "</strong></p>";
} // END of error IF
// Xoa file da duoc upload va ton tai trong thu muc tam
if(isset($_FILES['image']['tmp_name']) && is_file($_FILES['image']['tmp_name']) && file_exists($_FILES['image']['tmp_name'])) {
unlink($_FILES['image']['tmp_name']);
}
} // END main if
if(empty($errors)) {
// Update cSDL /// an uoload nay la cua johncms
mysql_query("INSERT INTO `cms_forum_files` SET
`cat` = '" . $res3['refid'] . "',
`subcat` = '" . $res2['refid'] . "',
`topic` = '" . $res['refid'] . "',
`post` = '$id',
`time` = '" . $time . "',
`filename` = '" . mysql_real_escape_string($renamed) . "',
`filetype` = '".$_FILES['type']."'
");
//// tao csdl thanh cong thì nen directo ng dung
}
?>
<form enctype="multipart/form-data" action="" method="post">
<fieldset>
<legend>Avatar</legend>
<div>
<img class="avatar" src="uploads/images/<?php echo (is_null($user['avatar']) ? "no_avatar.jpg" : $user['avatar']); ?>" alt="avatar" />
<p>Please select a JPEG or PNG image of 512Kb or smaller to use as avatar<p>
</label>
<input type="hidden" name="MAX_FILE_SIZE" value="524288" />
<input type="file" name="image" />
<p><input class="change" type="submit" name="upload" value="Save changes" /></p>
</div>
</fieldset>
</form>
à nhớ là ctrl + f tìm /upload/forum/ để đổi tên thu mục upload nhé !
Hướng Dẫn :
những thử cơ bản mình sẽ không nói nhé :
1. dòng này là những định dạng cho phép upload ! các bạn có thể thêm vào !
$allowed = array('image/jpeg', 'image/jpg', 'image/png', 'images/x-png');
2. kiểm tra định dạng file ! hàm strtolower có nghĩa là ko phân biệt hoa hay thường để tránh nhầm lẫn giữa .PNG và .png
in_array(strtolower($_FILES['image']['type']), $allowed)
3.hàm này có nghĩa là tìm đến dấu chấm ( . ) để tách phần đuôi file
VD : file tên aaa.ass.ccc.png vậy thì nó sẽ có thể hiểu phần phần mở rộng à ass ! vì thế ta dùng hàm end vấn đề này johncms vướng phải
$ext = end(explode('.', $_FILES['image']['name']));
4.phần này nghĩa là đổi tên file ! mục đích là dữ an toàn khi đưa vào CSDL
uniqid là hàm tạo ra 1 chỗi đặc biệt !
$renamed = uniqid(rand(), true).'.'."$ext";
5. move_uploaded_file có nghĩa là upload tập tin của mình lên sever ! trong này nó sẽ dùng 2 tham số : move_uploaded_file(filename , destination)
trong đó filename là file mình muốn đưa lên sever và destination chính là nơi lưu trữ file !
dòng code này nếu thỏa mãn thì sẽ thực hiện việc upload
if(!move_uploaded_file($_FILES['image']['tmp_name'], "/upload/forum/".$renamed)) {
6. đi đôi với upload thành công thì cũng là thất bại việc upload thật bại sẽ trả về các giá trị
errors =1,2,3,4,6,7,8 ko có 5 nhé !
7.Xóa FIle trong bộ nhớ tạm thời
đầu tiên thì bạn phải kiểm tra xem file có giá trị ko !
is_file : kiểm tra có phải định dạng file ko ?
file_exists : kiểm tra file đó có nằm trên sever của mình ko
nếu thỏa mãn điều kiện thì thự hiện xóa file ở bộ nhớ đệm bằng hàm unlink
việc này sẽ làm sever bạn nhẹ hơn ! đỡ tốn băng thông hơn !
if(isset($_FILES['image']['tmp_name']) && is_file($_FILES['image']['tmp_name']) && file_exists($_FILES['image']['tmp_name'])) {
unlink($_FILES['image']['tmp_name']);
}
unlink($_FILES['image']['tmp_name']);
}
8.Cuối Cùng Là Uploaf thành công rồi thì update nó vào CSDL thôi
mỗi code có table khác nhau nên mình ko hướng dẫn nhé !
code trên là dùng cho johncms nhé !
Nếu Bạn Dùng HDK_CMS của mình thì thay đoạn sql như sau :
// Update cSDL
$q = "UPDATE users SET avatar = '{$renamed}' WHERE user_id = {$_SESSION['uid']} LIMIT 1";
$r = mysqli_query($dbc, $q); confirm_query($r, $q);
if(mysqli_affected_rows($dbc) > 0) {
// Update thanh cong, chuyen huong nguoi dung ve trang edit_profile
redirect_to('edit_profile.php');
}
$q = "UPDATE users SET avatar = '{$renamed}' WHERE user_id = {$_SESSION['uid']} LIMIT 1";
$r = mysqli_query($dbc, $q); confirm_query($r, $q);
if(mysqli_affected_rows($dbc) > 0) {
// Update thanh cong, chuyen huong nguoi dung ve trang edit_profile
redirect_to('edit_profile.php');
}
Nguồn: Daksong.
Edited MinhNP
#9 (0) |