Author Topic: Upload ảnh và tạo thumbnail  (Read 16317 times)

Daredevil

  • PHP Intermediate
  • *
  • Posts: 30
    • View Profile
    • Email
Upload ảnh và tạo thumbnail
« on: May 26, 2008, 11:30:24 AM »
Tut này sẽ hướng dẫn các bạn cách upload 1 ảnh lên server(quá bình thường) và tạo 1 ảnh thumb(ảnh nhỏ) của ảnh đó
script mình viết duy nhất trên 1 file php đặt tên là upload_thumb.php
đầu tiên khai báo 1 mảng các định dạng file(ảnh) đc phép upload(ở đây mình cho phép up 3 kiểu file là jpg, gif và png)
Code: [Select]
<?php
// Khai bao 1 mang cac dinh dang dc phep upload
$arrExt = array('jpg','gif','png');
Tiếp theo là 1 hàm trả về định dạng của 1 file với tham số truyền vào là chuỗi tên file
Code: [Select]
// Ham tra ve dinh dang file getExt('mypicture.jpg') -> jpg
function getExt($filename){
return $ext = strtolower(substr(strrchr($filename, '.'), 1));
}
vd bạn truyền vào như sau: getExt('mypicture.jpg') thì kết quả trả về sẽ là jpg
Tiếp theo là 1 form HTML đơn giản với 1 ô để chọn file upload và 1 button submit form
Code: [Select]
<form action="" method="post" enctype="multipart/form-data">
<input type="file" name="file"><input type="submit" value="Upload">
</form>
sau khi chọn file và click nút upload thì ta sẽ xử lý bên phía server như sau
Code: [Select]
if($_FILES['file']){
$dir = 'tmp/';
$thumb = $dir.'thumbs/';
$w = '200';
$h = '200';
$ext = getExt($_FILES['file']['name']);
if(in_array($ext, $arrExt)){
if(move_uploaded_file($_FILES['file']['tmp_name'], $dir.$_FILES['file']['name'])){
list($width, $height) = getimagesize($dir.$_FILES['file']['name']);
$image_p = imagecreatetruecolor($w, $h);
//

switch($ext){
case "jpg":
$image = imagecreatefromjpeg($dir.$_FILES['file']['name']);
break;

case "gif":
$image = imagecreatefromgif($dir.$_FILES['file']['name']);
break;

case "png":
$image = imagecreatefrompng($dir.$_FILES['file']['name']);
break;

default :
$image = imagecreatefromjpeg($dir.$_FILES['file']['name']);
break;
}
imagecopyresampled($image_p, $image, 0, 0, 0, 0, $w, $h, $width, $height);
// Output & save to file
$thumb_file = 'thumb_'.time().'.jpg';
$tmp_content = imagejpeg($image_p, $thumb.$thumb_file, 100);
}
else{
echo 'Failed';
}
}
else{
echo $ext.' file is not allowed';
}

}
để mình giải thích từng đoạn
ở dòng đầu tiên
Code: [Select]
if($_FILES['file']){ là để kiểm tra xem người dùng đã chọn file và bấm nút upload chưa(form đã đc submit) bằng cách kiểm tra sự tồn tại của biến global $_FILES['file']
Tiếp theo là khai báo thư mục để upload ảnh gốc, thư mục chứa ảnh nhỏ và chiều dài+cao của ảnh nhỏ
Code: [Select]
$dir = 'tmp/';
$thumb = $dir.'thumbs/';
$w = '200';
$h = '200';
như vậy ảnh gốc sẽ đc upload vào thư mục /tmp còn ảnh nhỏ sẽ lưu vào thư mục /tmp/thumbs/ với chiều dài+cao là 200x200
Tiếp theo là lấy "đuôi" của file qua hàm getExt() đã khai báo trước đó
Code: [Select]
$ext = getExt($_FILES['file']['name']);
và kiểm tra xem file người dùng tải lên có đc phép hay ko(thuộc $arrExt)
Code: [Select]
if(in_array($ext, $arrExt)){
  ...
}
Bước kế chúng ta sẽ upload ảnh vào thư mục đã khai báo(tmp) = hàm move_uploaded_file
Code: [Select]
move_uploaded_file($_FILES['file']['tmp_name'], $dir.$_FILES['file']['name'])
lấy chiều rộng và cao của ảnh up lên
Code: [Select]
list($width, $height) = getimagesize($dir.$_FILES['file']['name']);
tạo 1 resource image ảnh nhỏ với chiều rộng và cao đã khai báo(200x200)
Code: [Select]
$image_p = imagecreatetruecolor($w, $h);
tùy vào loại file ảnh mà dùng hàmtảo ảnh cho phù hợp, ở đây mình dùng switch
Code: [Select]
switch($ext){
case "jpg":
$image = imagecreatefromjpeg($dir.$_FILES['file']['name']);
break;

case "gif":
$image = imagecreatefromgif($dir.$_FILES['file']['name']);
break;

case "png":
$image = imagecreatefrompng($dir.$_FILES['file']['name']);
break;

default :
$image = imagecreatefromjpeg($dir.$_FILES['file']['name']);
break;
}
và bắt đầu resize
Code: [Select]
imagecopyresampled($image_p, $image, 0, 0, 0, 0, $w, $h, $width, $height);
tạo tên file cho ảnh nhỏ và lưu vào thư mục
Code: [Select]
// Output & save to file
$thumb_file = 'thumb_'.time().'.jpg';
$tmp_content = imagejpeg($image_p, $thumb.$thumb_file, 100);
Quote
bool imagejpeg ( resource $image [, string $filename [, int $quality]] )
EOT (end of tut ^^)
made by Daredevil
Các bạn có thể download file hoàn chỉnh mình gửi kèm bên dưới

hoangduye

  • PHP Starter
  • *
  • Posts: 4
    • View Profile
    • Email
Re: Upload ảnh và tạo thumbnail
« Reply #1 on: May 26, 2008, 12:36:29 PM »
sư phụ chỉ vài chiêu đi :">

Daredevil

  • PHP Intermediate
  • *
  • Posts: 30
    • View Profile
    • Email
Re: Upload ảnh và tạo thumbnail
« Reply #2 on: May 26, 2008, 01:40:44 PM »
chiêu gì? vít tut đó thôi :|

doangia

  • Administrator
  • PHP Intermediate
  • *****
  • Posts: 1099
  • Hữu Tâm Ắt Thành Tựu
    • View Profile
    • Doan Gia
    • Email
Re: Upload ảnh và tạo thumbnail
« Reply #3 on: May 26, 2008, 02:23:30 PM »
Tuts rất có giá trị :D .
Cần Thơ Gạo Trắng Nước Trong
Đến Chơi Mang Dép Chân Không Đi Về ...

™[SorivevoL]™

  • Global Moderator
  • PHP Intermediate
  • *****
  • Posts: 400
    • View Profile
    • Email
Re: Upload ảnh và tạo thumbnail
« Reply #4 on: May 27, 2008, 02:16:03 AM »
Cám ơn bạn đã đóng góp bài viết rất hay ^^ ^^

Zien2007

  • PHP Starter
  • *
  • Posts: 6
    • View Profile
    • Email
Re: Upload ảnh và tạo thumbnail
« Reply #5 on: June 08, 2008, 09:13:46 AM »
Anh Daredevil ơi cho em hỏi có cách nào kiểm tra sự tồn tại của một thư mục không ạ? Trong trường hợp trên giả sử kiểm tra thư mục Temp không tồn tại thì ta tạo mới.

Daredevil

  • PHP Intermediate
  • *
  • Posts: 30
    • View Profile
    • Email
Re: Upload ảnh và tạo thumbnail
« Reply #6 on: September 19, 2008, 04:40:37 PM »
Anh Daredevil ơi cho em hỏi có cách nào kiểm tra sự tồn tại của một thư mục không ạ? Trong trường hợp trên giả sử kiểm tra thư mục Temp không tồn tại thì ta tạo mới.
Bạn dùng hàm file_exists() để check
Code: [Select]
if(file_exists("/Temp")){
// Folder Temp da ton tai
}
else{
// Folder Temp chua ton tai, hay~ tao no :D
}

ntd1712

  • PHP Intermediate
  • *
  • Posts: 259
    • View Profile
    • Email
Re: Upload ảnh và tạo thumbnail
« Reply #7 on: September 19, 2008, 11:53:38 PM »
chú Daredevil này, nếu ở Saigon thì cafe đi

doangia

  • Administrator
  • PHP Intermediate
  • *****
  • Posts: 1099
  • Hữu Tâm Ắt Thành Tựu
    • View Profile
    • Doan Gia
    • Email
Re: Upload ảnh và tạo thumbnail
« Reply #8 on: September 20, 2008, 11:31:18 AM »
Nếu ở Cần Thơ thì ... cafe với tớ :D ...
@ntd1712 : 2 tuần nữa em lên SG cafe với bác :D
Cần Thơ Gạo Trắng Nước Trong
Đến Chơi Mang Dép Chân Không Đi Về ...

kusanagi

  • PHP Intermediate
  • *
  • Posts: 152
    • Yahoo Instant Messenger - kus.loveniz
    • View Profile
    • KusanagiVN
    • Email
Re: Upload ảnh và tạo thumbnail
« Reply #9 on: September 20, 2008, 02:33:43 PM »
em ở SG nè :D
Châm ngôn :
Ngu lâu dốt bền khó đào tạo :D
Tài lanh + Dốt nát = Báo đời ;D

KenyLieou

  • Global Moderator
  • PHP Intermediate
  • *****
  • Posts: 908
  • Nothing's Impossible
    • MSN Messenger - kiensuy2000@hotmail.com
    • View Profile
    • Email
Re: Upload ảnh và tạo thumbnail
« Reply #10 on: September 20, 2008, 11:43:53 PM »
@ntd cho em đi với kaka
+ PHPVN Supporter or Spamer :D 
+ Email: kenylieou@gmail.com. Please feel free to contact me

ntd1712

  • PHP Intermediate
  • *
  • Posts: 259
    • View Profile
    • Email
Re: Upload ảnh và tạo thumbnail
« Reply #11 on: September 24, 2008, 11:28:03 AM »
@doangia
Cho biết ngày giờ lên cụ thể luôn đi ông.

@KenyLieou
Vậy trả tiền cafe' nhá, vì tội bị "đá" mà chưa rửa
« Last Edit: November 14, 2011, 06:50:14 PM by ntd1712 »

KenyLieou

  • Global Moderator
  • PHP Intermediate
  • *****
  • Posts: 908
  • Nothing's Impossible
    • MSN Messenger - kiensuy2000@hotmail.com
    • View Profile
    • Email
Re: Upload ảnh và tạo thumbnail
« Reply #12 on: September 25, 2008, 05:10:45 PM »
@ntd: e.c anh lấy tin ở đâu thía T__T

@a DoanGia: a cứ call , và reply là: "anh dũng bận rồi anh ơi ... v.v.." :-"
+ PHPVN Supporter or Spamer :D 
+ Email: kenylieou@gmail.com. Please feel free to contact me

changdoncoi

  • PHP Starter
  • *
  • Posts: 1
    • View Profile
Re: Upload ảnh và tạo thumbnail
« Reply #13 on: December 08, 2008, 11:14:33 AM »
Sao mình không thấy chỗ download file nhỉ?

KenyLieou

  • Global Moderator
  • PHP Intermediate
  • *****
  • Posts: 908
  • Nothing's Impossible
    • MSN Messenger - kiensuy2000@hotmail.com
    • View Profile
    • Email
Re: Upload ảnh và tạo thumbnail
« Reply #14 on: December 08, 2008, 02:58:03 PM »
Sao mình không thấy chỗ download file nhỉ?
dled ở phía dưới bài #1 ấy
+ PHPVN Supporter or Spamer :D 
+ Email: kenylieou@gmail.com. Please feel free to contact me