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>
Trong file này mình tạo một Form upload và một đoạn code PHP xử lý khi submit upload.

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:

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;
}
Trong hàm này bạn cần chú ý tới hai tham số đó là tên đăng nhập và mật khẩu, bạn điền thông tin của bạn vào nhé.

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;
}
Trong hàm upload lên picasa này bạn sẽ có ba tham  số truyền vào:

  • $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 form
  • picasa.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:

upload-image-len-picasa.png

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é.

DOWNLOAD

Nguồn: freetuts.net

Profile photo of adminTheHalfHeart

TheHalfHeart

Có sở thích viết tuts nên đã từng tham gia viết ở một số diễn đàn, đến năm 2014 mới có điều kiện sáng lập ra freetuts.net. Sinh năm 90 và có 1 vợ 2 con, thích ca hát và lập trình.

ĐĂNG BÌNH LUẬN: Đăng câu hỏi trên Facebook để được hỗ trợ nhanh nhất.