Bài 06: Upload image lên Picasa sử dụng CURL trong PHP
Để tiết kiệm dung lượng lưu trữ cho website thì một số người lựa chọn giải pháp upload file lên Picasa rồi lấy đường dẫn về lưu trong CSDL, có người thì up bằng tay và có người thì dùng những tool có sẵn trên mạng để up tự động. Hôm nay mình sẽ hướng dẫn các bạn sử dụng CURL trong php để upload hình lên Picasa để các bạn tiện sử dụng cho website
1. Điều kiện để upload image lên Picasa
Như các bạn biết, mỗi tài khoản Google sẽ được cung cấp một tài khoản upload trên hệ thống Picasa và muốn up được thì bắt buộc chúng ta phải đăng nhập vào hệ thống. Chung quy lại quy trình sẽ như sau:
- Vì sử dụng CURL để đọc file nên bạn có thể lấy xây dựng chức năng lấy hình từ URL trên mạng hoặc lấy trực tiếp từ hệ thống, trong bài này mình sử dụng php để upload file lên server rồi mới up lên picasa
- Đăng nhập vào tài khoản Google mới có thể up file được, như vậy chúng ta phải cung cấp username và password của tài khoản Google.
- Bạn phải cung cấp albumID và account hoặc accountID thì mới upload lên picasa được
- Khi gửi phải có các thông số XML, header tuân theo chuẩn của Google đặt ra, các bạn có thể tham khảo tại link này.
- Sau khi upload xong nếu bạn không có nhu cầu sử dụng file đã upload lên server riêng thì hãy xóa nó đi, trong bài này mình không có xóa
2. Xây dựng Form upload file
Bạn tạo file upload.php
với nội dung như sau:
<!DOCTYPE html> <html> <head> <title></title> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> </head> <body> <form method="post" action="upload.php" enctype="multipart/form-data"> <input type="file" name="image" /> <input type="submit" value="Upload" name="upload"/> <br/> <?php // XỬ LÝ KHI SUBMIT ?> </form> </body> </html>
3. Viết các hàm Upload File - Login Google - Upload Picasa
Bây giờ bạn tạo file picasa.php
với nội dung là chứa ba hàm quan trọng như sau:
Bài viết này được đăng tại [free tuts .net]
Hàm Upload File
// $key là tên input file function upload_file($key) { if (!empty($_FILES[$key]) && $_FILES[$key]['error'] <= 0) { if (move_uploaded_file($_FILES[$key]['tmp_name'], './'.$_FILES[$key]['name'])) { return './'.$_FILES[$key]['name']; } } return false; }
Hàm login Google acount
function login_google() { // Đăng nhập vào account $data = array( 'accountType' => 'GOOGLE', 'Email' => 'ti_khoan_cua_ban@gmail.com', // Email của bạn 'Passwd' => 'mat_khau_cua_ban', // Mật khẩu của bạn 'source' => __FILE__, 'service' =>'lh2' ); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, "https://www.google.com/accounts/ClientLogin"); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.1) Gecko/20061204 Firefox/2.0.0.1" ); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_POSTFIELDS, $data); $hasil = curl_exec($ch); // Kiểm tra kết quả thành công hay thất bại // Nếu thành công thì google sẽ trả về đoạn mã có định dạng // Auth=key, nên ta lấy key bằng cách sử dụng hàm preg_match if (preg_match('#Auth=([a-z0-9_\-]+)#i', $hasil, $match)) { return $match[1]; } return false; }
Hàm upload hình lên Picasa
// $path là đường dẫn đến file cần upload tr function upload_picasa($path, $accountID = '', $albumID = '') { $key = login_google(); // Kiểm tra key login if (!$key){ return 'Không thể đăng nhập vào tài khoản Google'; } // Kiểm tra file tồn tại không if (!file_exists($path)){ return 'File cần upload không tồn tại'; } // Đường dẫn tới Album cần đăng $albumUrl = "https://picasaweb.google.com/data/feed/api/user/$accountID/albumid/$albumID"; // XML Upload được cung cấp bởi google $rawImgXml = '<entry xmlns="http://www.w3.org/2005/Atom"> <title>ten_file_sau_khi_upload.jpg</title> <summary>Mô tả file sau khi upload.</summary> <category scheme="http://schemas.google.com/g/2005#kind" term="http://schemas.google.com/photos/2007#photo"/> </entry>'; // Lấy thông tin File $fileSize = filesize($path); $fh = fopen($path, 'rb'); $imgData = fread($fh, $fileSize); fclose($fh); // Data header, cấu trúc được cung cấp bởi google $dataLength = strlen($rawImgXml) + $fileSize; $data = ""; $data .= "\nMedia multipart posting\n"; $data .= "--P4CpLdIHZpYqNn7\n"; $data .= "Content-Type: application/atom+xml\n\n"; $data .= $rawImgXml . "\n"; $data .= "--P4CpLdIHZpYqNn7\n"; $data .= "Content-Type: image/jpeg\n\n"; $data .= $imgData . "\n"; $data .= "--P4CpLdIHZpYqNn7--"; $header = array( 'GData-Version: 2', 'Authorization: GoogleLogin auth="'.$key.'"', 'Content-Type: multipart/related; boundary=P4CpLdIHZpYqNn7;', 'Content-Length: ' . strlen($data), 'MIME-version: 1.0' ); // Upload $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $albumUrl); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_POSTFIELDS, $data); curl_setopt($ch, CURLOPT_HEADER, true); curl_setopt($ch, CURLOPT_HTTPHEADER, $header); $ret = curl_exec($ch); curl_close($ch); // Xử lý kết quả trả về để lấy đường dẫn preg_match('#<gphoto:width>(\d+)</gphoto:width>#', $ret, $match); $width = $match[1]; preg_match('#<gphoto:height>(\d+)</gphoto:height>#', $ret, $match); $height = $match[1]; preg_match('#src=\'([^\'"]+)\'#', $ret, $match); $url = $match[1]; $size = max($width, $height); $url = str_replace(basename($url), 's' . $size . '/' . basename($url), $url); return $url; }
$path
: đường dẫn đến file cần upload lên picasa$accountID
: ID tài khoản của bạn, hoặc username$albumID
: ID album của bạn, bạn phải vào picasa để lấy ID của một album nào đó nhé, nếu chưa có thì bạn up một hình để tạo album trên hệ thống của nó, sau đó vào RSS phía dưới bên phải để lấy ID trên URL, URL dạng như sau: https://picasaweb.google.com/data/feed/base/user/104078062985748317081/albumid/6091498454786943169?alt=rss&kind=photo&hl=en_US. Trong đó phần màu xanh là accountID và màu đỏ lả albumID.
Và đây là toàn bộ file picasa.php
// $key là tên input file function upload_file($key) { if (!empty($_FILES[$key]) && $_FILES[$key]['error'] <= 0) { if (move_uploaded_file($_FILES[$key]['tmp_name'], './'.$_FILES[$key]['name'])) { return './'.$_FILES[$key]['name']; } } return false; } function login_google() { // Đăng nhập vào account $data = array( 'accountType' => 'GOOGLE', 'Email' => 'ti_khoan_cua_ban@gmail.com', // Email của bạn 'Passwd' => 'mat_khau_cua_ban', // Mật khẩu của bạn 'source' => __FILE__, 'service' =>'lh2' ); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, "https://www.google.com/accounts/ClientLogin"); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.1) Gecko/20061204 Firefox/2.0.0.1" ); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_POSTFIELDS, $data); $hasil = curl_exec($ch); // Kiểm tra kết quả thành công hay thất bại // Nếu thành công thì google sẽ trả về đoạn mã có định dạng // Auth=key, nên ta lấy key bằng cách sử dụng hàm preg_match if (preg_match('#Auth=([a-z0-9_\-]+)#i', $hasil, $match)) { return $match[1]; } return false; } // $path là đường dẫn đến file cần upload tr function upload_picasa($path, $accountID = '104078062985748317081', $albumID = '6091498454786943169') { $key = login_google(); // Kiểm tra key login if (!$key){ return 'Không thể đăng nhập vào tài khoản Google'; } // Kiểm tra file tồn tại không if (!file_exists($path)){ return 'File cần upload không tồn tại'; } // Đường dẫn tới Album cần đăng $albumUrl = "https://picasaweb.google.com/data/feed/api/user/$accountID/albumid/$albumID"; // XML Upload được cung cấp bởi google $rawImgXml = '<entry xmlns="http://www.w3.org/2005/Atom"> <title>ten_file_sau_khi_upload.jpg</title> <summary>Mô tả file sau khi upload.</summary> <category scheme="http://schemas.google.com/g/2005#kind" term="http://schemas.google.com/photos/2007#photo"/> </entry>'; // Lấy thông tin File $fileSize = filesize($path); $fh = fopen($path, 'rb'); $imgData = fread($fh, $fileSize); fclose($fh); // Data header, cấu trúc được cung cấp bởi google $dataLength = strlen($rawImgXml) + $fileSize; $data = ""; $data .= "\nMedia multipart posting\n"; $data .= "--P4CpLdIHZpYqNn7\n"; $data .= "Content-Type: application/atom+xml\n\n"; $data .= $rawImgXml . "\n"; $data .= "--P4CpLdIHZpYqNn7\n"; $data .= "Content-Type: image/jpeg\n\n"; $data .= $imgData . "\n"; $data .= "--P4CpLdIHZpYqNn7--"; $header = array( 'GData-Version: 2', 'Authorization: GoogleLogin auth="'.$key.'"', 'Content-Type: multipart/related; boundary=P4CpLdIHZpYqNn7;', 'Content-Length: ' . strlen($data), 'MIME-version: 1.0' ); // Upload $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $albumUrl); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_POSTFIELDS, $data); curl_setopt($ch, CURLOPT_HEADER, true); curl_setopt($ch, CURLOPT_HTTPHEADER, $header); $ret = curl_exec($ch); curl_close($ch); // Xử lý kết quả trả về để lấy đường dẫn preg_match('#<gphoto:width>(\d+)</gphoto:width>#', $ret, $match); $width = $match[1]; preg_match('#<gphoto:height>(\d+)</gphoto:height>#', $ret, $match); $height = $match[1]; preg_match('#src=\'([^\'"]+)\'#', $ret, $match); $url = $match[1]; $size = max($width, $height); $url = str_replace(basename($url), 's' . $size . '/' . basename($url), $url); return $url; }
4. Viết code Upload file khi submit form
Quay lại file upload.php
bạn sẽ thêm nội dung PHP vào trong đoạn code mà mình đã comment sẵn ở đó
<!DOCTYPE html> <html> <head> <title></title> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> </head> <body> <form method="post" action="upload.php" enctype="multipart/form-data"> <input type="file" name="image" /> <input type="submit" value="Upload" name="upload"/> <br/> <?php if (!empty($_POST['upload'])) { require "picasa.php"; $path = upload_file('image'); if ($path){ echo upload_picasa($path); } } ?> </form> </body> </html>
Như vậy là ta có hai file chính, đó là:
upload.php
dùng để hiển thị form và xử lý sự kiện khi submit formpicasa.php
chứa những hàm upload file, đăng nhập vào tài khoản google và thực hiện upload file lên picasa
Đây là thành quả của chúng ta:
5. Lời Kết
Bài này cũng tương đối đơn giản, điều quan trọng nhất là bạn phải nắm được kiến thức nền tảng của CURL, kết hợp với các thông số mà Google Picasa cung cấp cho chúng ta để thực hiện đăng nhập và upload hình lên Picasa. Chúc các bạn thành công nhé.
Danh sách file tải về
Tên file tải về | Pass giải nén |
---|---|
Tải mã nguồn | freetuts.net hoặc gameportable.net |