Hướng dẫn dùng image processor trong PHP

Với mọi trang web đều phải có chức năng upload image lên đưa Database với mục đích thêm hình ảnh vào cơ sở dữ liệu MySQL. Bài viết này sẽ hướng dẫn bạn cách upload ảnh bằng PHP và MySQL với những đoạn code dễ hiểu đọc xong bạn hoàn toàn có thể làm được.

  • Readmore : Code hiển thị nội dung bài viết trong PHP

Với bài tập này bạn sẽ biết cách lưu đường dẫn ảnh vào Database và hiển thị bức ảnh lên trên website. Nào hãy bắt đầu thôi!

Hướng dẫn dùng image processor trong PHP

Bước 1: Bạn sẽ khởi tạo 4 file như trong hình

  • photo: dùng để lưu hình ảnh trên máy tính
  • connect.php; kết nối tới Database
  • style; thêm CSS để trang trí form
  • upload.php; file upload ảnh
  • xuly.php; xử lý ảnh sau khi upload

Tạo 1 cơ sở dữ liệu Database tên là ‘upload_image‘ => sau đó tạo bảng Table tên là images bằng paste đoạn MySQL vào Database

CREATE TABLE IF NOT EXISTS `images` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`image` varchar(100) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;

Bước 2: Tiếp theo bạn sẽ tạo một file upload.php

 
 
 
Image Upload 
 
 
 

Bước 3: Tiếp theo sẽ tạo một file là xuly.php

 2097152) {
$errors[]='Kích thước file không được lớn hơn 2MB';
}
$image = $_FILES['image']['name'];
$target = "photo/".basename($image);
$sql = "INSERT INTO images (image) VALUES ('$image')";
mysqli_query($conn, $sql);
if (move_uploaded_file($_FILES['image']['tmp_name'], $target)) {
echo '';
}else{
echo '';
}
}
$result = mysqli_query($conn, "SELECT * FROM images");
?>



Image Upload



"; echo "

Sử dụng biến:

Trong pixel.php của bạn, sau đó bạn có thể phân tích và giải thích bất kỳ biến $_GET nào được truyền cho nó trong thẻ hình ảnh, một cách đơn giản:

if (isset($_GET['a'])) {
  // (Do|log) act on a
}
if (isset($_GET['b'])) {
  // (Do|log) act on b
}
if (isset($_GET['c'])) {
  // (Do|log) act on c
}

Áp dụng và lặp lại khi bạn cần, nhưng bạn có thể khá tinh vi về những gì bạn làm và đặc biệt là khi bạn có quyền truy cập vào khá nhiều thông tin về người dùng thông qua việc có thể đặt vars trên chuỗi $_GET.

Một ví dụ phù hợp hơn có thể là:


Theo dõi nhiều hơn chỉ các biến $ _GET:

Bạn cũng có thể lấy thêm nhiều thông tin bằng PHP, chẳng hạn như:

// Server variables
$ip = $_SERVER['REMOTE_ADDR'];
$referer = $_SERVER['HTTP_REFERER'];
$useragent = $_SERVER['HTTP_USER_AGENT'];
$browser = get_browser(null, true);
etc...

và sau đó có thể chèn vào bảng theo dõi trong cơ sở dữ liệu của bạn: 

$sql = "INSERT INTO campaign_tracking 
        ('when','campaign','last','ip','useragent') 
        VALUES 
        (NOW(),'$campaign','$last','$ip','$useragent')";

Đây là phương thức cơ bản a(the) được sử dụng rộng rãi để theo dõi các chiến dịch tiếp thị email và cụ thể là trong PHP, nhưng phương pháp tương tự được áp dụng bằng các ngôn ngữ và thư viện lập trình/kịch bản khác - và cho các mục đích khác.

Thông tin thêm và hữu ích về Gd:

  • Tham khảo GV - trên php.net

Từ câu hỏi của bạn, có vẻ như bạn là người mới đối với GD, tôi sẽ chia sẻ một số kinh nghiệm của tôi, có thể đây là một chủ đề hơi xa vời, nhưng tôi nghĩ nó sẽ hữu ích cho người mới làm quen với GD như bạn:

Bước 1, xác nhận tập tin. Sử dụng chức năng sau để kiểm tra xem $_FILES['image']['tmp_name']tệp có phải là tệp hợp lệ không:

   function getContentsFromImage($image) {
      if (@is_file($image) == true) {
         return file_get_contents($image);
      } else {
         throw new \Exception('Invalid image');
      }
   }
   $contents = getContentsFromImage($_FILES['image']['tmp_name']);

Bước 2, lấy định dạng tệp Hãy thử chức năng sau với phần mở rộng finfo để kiểm tra định dạng tệp của tệp (nội dung). Bạn sẽ nói tại sao bạn không sử dụng $_FILES["image"]["type"]để kiểm tra định dạng tệp? Bởi vì nó CHỈ kiểm tra phần mở rộng tệp không phải nội dung tệp, nếu ai đó đổi tên tệp ban đầu được gọi là world.png thành world.jpg , $_FILES["image"]["type"]sẽ trả về jpeg không png, do đó $_FILES["image"]["type"]có thể trả về kết quả sai.

   function getFormatFromContents($contents) {
      $finfo = new \finfo();
      $mimetype = $finfo->buffer($contents, FILEINFO_MIME_TYPE);
      switch ($mimetype) {
         case 'image/jpeg':
            return 'jpeg';
            break;
         case 'image/png':
            return 'png';
            break;
         case 'image/gif':
            return 'gif';
            break;
         default:
            throw new \Exception('Unknown or unsupported image format');
      }
   }
   $format = getFormatFromContents($contents);

Bước.3, Nhận tài nguyên GD Nhận tài nguyên GD từ nội dung chúng tôi có trước đây:

   function getGDResourceFromContents($contents) {
      $resource = @imagecreatefromstring($contents);
      if ($resource == false) {
         throw new \Exception('Cannot process image');
      }
      return $resource;
   }
   $resource = getGDResourceFromContents($contents);

Bước 4, lấy kích thước hình ảnh Bây giờ bạn có thể lấy kích thước hình ảnh với mã đơn giản sau:

  $width = imagesx($resource);
  $height = imagesy($resource);

Bây giờ, chúng ta hãy xem biến chúng ta đã nhận được từ hình ảnh gốc sau đó:

       $contents, $format, $resource, $width, $height
       OK, lets move on

Bước 5, tính toán các đối số hình ảnh đã thay đổi kích thước Bước này liên quan đến câu hỏi của bạn, mục đích của chức năng sau là để thay đổi kích thước đối số cho chức năng GD imagecopyresampled(), mã này khá dài, nhưng nó hoạt động rất tốt, thậm chí có ba tùy chọn: kéo dài, thu nhỏ và điền vào.

căng : kích thước của hình ảnh đầu ra giống với kích thước mới bạn đặt. Không giữ tỷ lệ chiều cao / chiều rộng.

thu nhỏ : kích thước của hình ảnh đầu ra sẽ không vượt quá kích thước mới mà bạn cung cấp và giữ tỷ lệ chiều cao / chiều rộng của hình ảnh.

fill : kích thước của hình ảnh đầu ra sẽ giống với kích thước mới mà bạn cung cấp, nó sẽ cắt và thay đổi kích thước hình ảnh nếu cần và giữ tỷ lệ chiều cao / chiều rộng của hình ảnh. Tùy chọn này là những gì bạn cần trong câu hỏi của bạn.

   function getResizeArgs($width, $height, $newwidth, $newheight, $option) {
      if ($option === 'stretch') {
         if ($width === $newwidth && $height === $newheight) {
            return false;
         }
         $dst_w = $newwidth;
         $dst_h = $newheight;
         $src_w = $width;
         $src_h = $height;
         $src_x = 0;
         $src_y = 0;
      } else if ($option === 'shrink') {
         if ($width <= $newwidth && $height <= $newheight) {
            return false;
         } else if ($width / $height >= $newwidth / $newheight) {
            $dst_w = $newwidth;
            $dst_h = (int) round(($newwidth * $height) / $width);
         } else {
            $dst_w = (int) round(($newheight * $width) / $height);
            $dst_h = $newheight;
         }
         $src_x = 0;
         $src_y = 0;
         $src_w = $width;
         $src_h = $height;
      } else if ($option === 'fill') {
         if ($width === $newwidth && $height === $newheight) {
            return false;
         }
         if ($width / $height >= $newwidth / $newheight) {
            $src_w = (int) round(($newwidth * $height) / $newheight);
            $src_h = $height;
            $src_x = (int) round(($width - $src_w) / 2);
            $src_y = 0;
         } else {
            $src_w = $width;
            $src_h = (int) round(($width * $newheight) / $newwidth);
            $src_x = 0;
            $src_y = (int) round(($height - $src_h) / 2);
         }
         $dst_w = $newwidth;
         $dst_h = $newheight;
      }
      if ($src_w < 1 || $src_h < 1) {
         throw new \Exception('Image width or height is too small');
      }
      return array(
          'dst_x' => 0,
          'dst_y' => 0,
          'src_x' => $src_x,
          'src_y' => $src_y,
          'dst_w' => $dst_w,
          'dst_h' => $dst_h,
          'src_w' => $src_w,
          'src_h' => $src_h
      );
   }
   $args = getResizeArgs($width, $height, 150, 170, 'fill');

Bước 6, thay đổi kích thước hình ảnh sử dụng $args, $width, $height, $formatvà tài nguyên $ chúng tôi nhận được từ trên vào các chức năng sau đây và nhận được tài nguyên mới của hình ảnh thay đổi kích cỡ:

   function runResize($width, $height, $format, $resource, $args) {
      if ($args === false) {
         return; //if $args equal to false, this means no resize occurs;
      }
      $newimage = imagecreatetruecolor($args['dst_w'], $args['dst_h']);
      if ($format === 'png') {
         imagealphablending($newimage, false);
         imagesavealpha($newimage, true);
         $transparentindex = imagecolorallocatealpha($newimage, 255, 255, 255, 127);
         imagefill($newimage, 0, 0, $transparentindex);
      } else if ($format === 'gif') {
         $transparentindex = imagecolorallocatealpha($newimage, 255, 255, 255, 127);
         imagefill($newimage, 0, 0, $transparentindex);
         imagecolortransparent($newimage, $transparentindex);
      }
      imagecopyresampled($newimage, $resource, $args['dst_x'], $args['dst_y'], $args['src_x'], $args['src_y'], $args['dst_w'], $args['dst_h'], $args['src_w'], $args['src_h']);
      imagedestroy($resource);
      return $newimage;
   }
   $newresource = runResize($width, $height, $format, $resource, $args);

Bước 7, nhận nội dung mới , Sử dụng chức năng sau để nhận nội dung từ tài nguyên GD mới:

   function getContentsFromGDResource($resource, $format) {
      ob_start();
      switch ($format) {
         case 'gif':
            imagegif($resource);
            break;
         case 'jpeg':
            imagejpeg($resource, NULL, 100);
            break;
         case 'png':
            imagepng($resource, NULL, 9);
      }
      $contents = ob_get_contents();
      ob_end_clean();
      return $contents;
   }
   $newcontents = getContentsFromGDResource($newresource, $format);

Bước 8 nhận tiện ích mở rộng , Sử dụng chức năng sau để nhận tiện ích mở rộng từ định dạng hình ảnh (lưu ý, định dạng hình ảnh không bằng tiện ích mở rộng hình ảnh):

   function getExtensionFromFormat($format) {
      switch ($format) {
         case 'gif':
            return 'gif';
            break;
         case 'jpeg':
            return 'jpg';
            break;
         case 'png':
            return 'png';
      }
   }
   $extension = getExtensionFromFormat($format);

Bước 9 lưu hình ảnh Nếu chúng ta có một người dùng có tên mike, bạn có thể thực hiện các thao tác sau, nó sẽ lưu vào cùng thư mục với tập lệnh php này:

$user_name = 'mike';
$filename = $user_name . '.' . $extension;
file_put_contents($filename, $newcontents);

Bước 10 hủy tài nguyên Đừng quên hủy tài nguyên GD!

imagedestroy($newresource);

hoặc bạn có thể viết tất cả mã của mình vào một lớp và chỉ cần sử dụng như sau:

   public function __destruct() {
      @imagedestroy($this->resource);
   }

LỜI KHUYÊN

Tôi khuyên bạn không nên chuyển đổi định dạng tệp mà người dùng tải lên, bạn sẽ gặp nhiều vấn đề.

9 hữu ích 0 bình luận chia sẻ