Trang

Thứ Năm, 18 tháng 7, 2013

Chức năng download với PHP thuần [PHP]

Download là một chức năng không thể thiếu đối với một trang web. Ta sẽ xây dựng một chức năng download với php thuần.
Phần I: Ứng dụng download với php thuần

1. Tạo cấu trúc thư mục như sau

  
Thư mục download chứa các file để download.

Thư mục hình chứa các hình đại diện cho file download.

2. Tạo cơ sở dữ liệu cho việc download

Ta sẽ tạo 2 bảng: 1 bảng để quản lý file download, 1 bảng để chứa code download

Bảng quản lý file download




Hinh : chứa tên file hình (chú ý tên này là tên thật của file trong thư mục download chứa trên server).

TenFile : là tên của file khi download về.

Url : Chứa đường dẫn tới file ( chú ý: đường dẫn chỉ có dạng tenfile.zip. Ta sẽ đặt một hằng xác định tên thư mục download, để sau này có thay đổi thư mục download ta chỉ cần thay đổi hằng này ).

Bảng để chứa code download





Mỗi một file download sẽ có nhiều code download, cột trạng thái sẽ xác định code này đã được sử dụng hay chưa (0: là chưa sử dụng, 1: đã xài rồi).

3. File dbCon.php để kết nối cơ sở dữ liệu

<?php
mysql_connect("localhost","root","root");
mysql_select_db("smsdownload");
mysql_query("SET NAMES 'UTF-8'");
?>

4. File functions.php chứa function download và function tạo chuỗi random để tạo code download

<?php

function Download_Limit_Time_Khoaphp($local_file, $download_file, $download_rate) {
    set_time_limit(0); // Thời gian download [0: tự do] [>0 giới hạn tgian]
    if(file_exists($local_file) && is_file($local_file)) {
    header('Cache-control: private');
    header('Content-Type: application/octet-stream');
    header('Content-Length: '.filesize($local_file));
    header('Content-Disposition: filename='.$download_file);
    flush();
    $file = fopen($local_file, "r");
     
    while (!feof($file)) {
    print fread($file, round($download_rate * 1024));
    flush();
    sleep(1);
    }
    fclose($file);
    }
    else {
    die('Loi: File '.$local_file.' Khong Ton Tai!');
    }
}

function TaoChuoi(){
    $s= "";
    $m = array(0,1,2,3,4,5,6,7,8,9);
    for($i=1; $i<=5; $i++){
        $ran = rand(0, count($m)-1);
        $kitu = $m[$ran];
        $s = $s . $kitu;    
    }
    return $s;
}

?>

set_time_limit: giới hạn thời gian download, hết thời gian script sẽ ngưng chạy. [0: tự do] [>0:giới hạn thời gian].

Hàm sleep: trì hoãn một khoảng thời gian, tính bằng giây. Hàm trên cứ 1 giây thì chạy vòng lặp. Trong vòng lặp là quy định dung lượng được tải xuống, dung lượng sẽ bằng download_rate x 1024 = dungluong(KB). Muốn download càng lâu thì tăng số giây trong hàm sleep, muốn download dung lượng nhiều hay ít thay đổi 1024 hoặc download_rate

header('Content-Disposition: filename='.$download_file); : Thay đổi tên file download thật chứa trên server bằng tên file download do mình đặt trong database.

5. File xulydownload.php

File này có tác dụng lấy id của hình, lấy số phone, sau đó tạo một code download tương ứng với id của hình cần download, rồi chèn vào bảng code với cột trạng thái bằng 0. File này cũng chính là file để xử lý tin nhắn của khách hàng gửi đến, rồi gửi lại code download cho khách hàng. Ở đây ta giả lập thôi.

<?php
require "../dbCon.php";
require "../functions.php";

$idFile = $_GET['idFile'];settype($idFile,"int");
$phone = $_GET['phone'];
$date = date("Y-m-d");
$code = TaoChuoi();

$insert = "INSERT INTO code(idCode,MaCode,idFile,TrangThai,Phone,Date) 
           VALUES(NULL,'$code','$idFile','0','$phone','$date')
          ";
mysql_query($insert);

echo $code."-".$idFile;

?>

Khi chạy file này nhớ cho thêm tham số idFile=file muốn down, phone=số điện thoại người gửi trên thanh địa chỉ để tạo code download.

6. File index.php

Bao gồm:

- Một form để nhập code download.

- Các hình đại diện cho file download và id của hình (muốn down file nào phải biết id của file đấy. id chính là idFile trong database).




<?php
require "../dbCon.php";
require "../functions.php";
define("dirDownload","download");
if(isset($_GET['btnTai']) && $_GET['code']!="" )
 {
     $code = $_GET['code'];settype($code,"int");
     $select = "SELECT code.*,file.* FROM code,file
                WHERE code.idFile = file.idFile
                AND MaCode = '$code'
                AND TrangThai='0'
                ";
     $qr2=mysql_query($select);
     $countRow=mysql_num_rows($qr2);
     if( $countRow == 1 )
       {
          $update = " UPDATE code
                      SET TrangThai = 1
                      WHERE MaCode = '$code'
                    ";
          mysql_query($update);            
          $rowDownload = mysql_fetch_array($qr2);
          $tenFile = $rowDownload['TenFile'].".zip";
          $Url = "../".dirDownload."/".$rowDownload['Url'];
          Download_Limit_Time_Khoaphp($Url,$tenFile,300);
       }else{
              echo "<h1>Code nay da su dung hoac khong ton tai</h1>";
            }
 }
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Untitled Document</title>
</head>
<body>
<form id="form1" name="form1" method="get" action="">
  <label>
    <input type="text" name="code" id="code" />
  </label>
  <label>
    <input type="submit" name="btnTai" id="btnTai" value="Download" />
  </label>
</form>
<?php
define("dirHinh","hinh");
$se = "SELECT * FROM file";
$qr = mysql_query($se);
while($row = mysql_fetch_array($qr))
 { ?>
   <div>     
   <img  src="../<?php echo dirHinh.'/'.$row['Hinh'] ?>"  />
   <?php echo $row['TenFile'] ?>
   Soan tin : SMS WEB46 <?php echo $row['idFile'] ?> goi toi 8085.
   </div>    
<?php } 
?>
</body>
</html>

Khi nhập code và ấn download, script sẽ lấy code về rồi lấy dữ liệu trong bảng code xem code này đã sử dụng hay chưa? (cột TrangThai = 0). Sau đó đếm số dòng trả về, nếu có 1 dòng trả về thì ok, ta tiến hành update cột trạng thái lên 1 rồi cho download. Còn không có thì hiện thông báo.

Phần 2: Ứng dụng download với tin nhắn

1. Đăng ký tài khoản Fibo

a. Giới thiệu Fibo:

FiboSMS gateway là 1 tương tác giữa nền tảng Web và SMS. Hệ thống sẽ xử lý các tin nhắn đến và trả về số di động của người nhắn 1 tin phản hồi!

FiboSMS Gateway được sử dụng nhằm kinh doanh, và tạo thêm thu nhập cho các bạn.

Các ứng dụng cơ bản của SMS Gateway: tải nhạc chuông, hình nền, truyện vui, xem bói, lời hay ý đẹp.... hay tích hợp vào diễn đàn như đăng ký nhanh, đổi tên nhanh, ủng hộ diễn đàn...

b. Nguyên tắc hoạt động

SMS Gateway (viết tắt là SG) hoạt động như thế nào?

- Đầu tiên, khách hàng sẽ nhắn 1 tin, với nội dung theo đúng 1 cú pháp nhất định nào đó, và gửi đến 1 số điện thoại (nằm trong hệ thống số mà Fibo SG hỗ trợ).

- SG sẽ xử lý tin nhắn vừa nhận được.

- Trước hết, SG sẽ kiểm tra xem, cú pháp tin nhắn (bao gồm tối thiểu keyword và tiếp đầu ngữ) có đúng hay không, và có được đăng ký hay chưa (cú pháp bắt buộc này mình sẽ nói tiếp ở phần sau).

         Trường hợp 1: Nếu cú pháp hợp lệ, và đã có đăng ký cho cú pháp đó, SG sẽ chuyển toàn bộ dữ liệu về tin nhắn đó đến trang xử lý được đăng ký ở trên.

             + Trang xử lý này là 1 code được lập trình trên nền web động (như PHP, ASP...).
             + Đến lúc này, việc xử lý sẽ thuộc về trang code. Tùy nhu cầu mà các bạn có thể code cho phù hợp.
             + Trang code đó, sau khi xử lý xong, sẽ phải trả về cho SG 1 nội dung hồi đáp, đúng cú pháp.
             + SG nhận nội dung đó và kiểm tra xem nội dung trả về có đúng hay không, nếu đúng sẽ gửi nội dung 1 web trả về vào số điện thoại của người gửi. Nếu không, sẽ trả về nội dung là "Lỗi xử lý tin nhắn" cho người đó!  

         Trường hợp 2: Nếu cú pháp không hợp lệ, lúc này, tin ửi đến sẽ không được đưa đến 1 trang web xử lý nào cả, mà SG sẽ trả về ngay cho khách hàng 1 tin nhắn với nội dung là "Lỗi cú pháp tin nhắn".

2. Sau khi đăng ký xong, ta đăng nhập vào tài khoản Fibo và thực hiện cầu hình:

a. Tạo một Keyword Free







b. Sau khi tạo keyword free ta tiến hành cầu hình tin nhắn đến




Sau đó ta chọn Add New. Tiếp tục ta cấu hình như hình dưới rồi ấn Save




Chú ý: Nội dung của dịch vụ không phải là nội dung trả về cho người nhắn tin, mà chủ yếu để chú thich cho dịch vụ này

3. Sau khi đã cầu hình trên Fibo xong, ta tiến hành viết code cho trang web xử lý tin nhắn.

a. Download file cấu hình

Đầu tin ta download mấy file cầu hình do Fibo viết. Có tất cả 4 file, trong đó có một file cho phép ta lấy dữ liệu tin nhắn đến, việc còn lại là chúng ta xử lý dữ liệu đó, rồi trả về cho Fibo dữ liệu mà dữ liệu đó sẽ được gửi lại cho người đã nhắn tin

Download

Sau khi download xong ta để 4 file đó chung với nhau. File smshellofibo.php chính là file ta sẽ xử lý tin nhắn đên. Ta nên đổi tên file là xulydownload.php cho dễ nhớ, sau đó chỉnh sửa lại cho đúng với mục đích của chúng ta

<?php
require_once('fibosmsconfig.php'); // Khai báo dùng hàm của Fibo 
CheckRequest();              //Hàm kiểm tra request, đảm bảo yêu cầu xử lý đến từ server của Fibo

// Require database và funtioon tao chuỗi
require "../dbCon.php";
require "../functions.php";

// Lấy nội dung tin nhắn
$message =$_REQUEST['message']; // Nội dung tin hay la cu pháp của tin
$phone= $_REQUEST['phone']; // số điện thoại của KH
$service=$_REQUEST['service']; // mã dịch vụ
$port =$_REQUEST['port'];  // đầu số
$main =$_REQUEST['main'];  //keyword
$sub =$_REQUEST['sub'];  // prefix
// Hết lấy nội dung tin nhắn

$md5id = md5(uniqid(rand(), true));// id duy nhất để gán cho tin trả về
if($port!='8085')// kiểm tra xem có đúng đầu số không?
{
    // trường hợp nhắn sai đầu số
    echo '
            <ClientResponse>
                <Message>
                    <PhoneNumber>'.$phone.'</PhoneNumber>
                    <Message>Ban da nhan sai dau so</Message>
                    <SMSID>'.$md5id.'</SMSID>
                    <ServiceNo>'.$service.'</ServiceNo>
                </Message>
            </ClientResponse>';
    
}
else // xử lý tin
{
    $message= strtoupper($message);
    $tmp=explode(" ",$message);//cắt nội dung tin ra làm 3 phần
    
    $keyword = $tmp['0'];// phần thứ nhất chứa keyword
    $prefix = $tmp['1'];//phần thứ 2 chứa Prefix
    $idFile = $tmp['2']; //phần 3 chứa idFile
         
    
    if( $keyword == 'SMS' && $prefix == 'VHW' && is_numeric($idFile)) 
    {
        //Ngay
         $date = date("Y-m-d");
         
         //Code download
         $code = TaoChuoi();
         
         // chen vao csdl

         $insert = "INSERT INTO code(idCode,MaCode,idFile,TrangThai,Phone,Date) 
           VALUES(NULL,'$code','$idFile','0','$phone','$date')
          ";
         mysql_query($insert);
        
        echo '
        <ClientResponse>
            <Message>
                <PhoneNumber>'.$phone.'</PhoneNumber>
                <Message>'.'Ma download la $code'.'</Message>
                <SMSID>'.$md5id.'</SMSID>
                <ServiceNo>'.$service.'</ServiceNo>
            </Message>
        </ClientResponse>';

    }
    else// nếu sai thi trả về hướng dẫn nhắn lại cho đúng cú pháp
    {
        echo '
        <ClientResponse>
            <Message>
                <PhoneNumber>'.$phone.'</PhoneNumber>
                <Message>Xin chao, noi dung tin nhan khong hop le. Vui long goi tin nhan theo noi dung SMS VHW MaSo</Message>
                <SMSID>'.$md5id.'</SMSID>
                <ServiceNo>'.$service.'</ServiceNo>
            </Message>
        </ClientResponse>';
        
    }
}
?>

Cuối cùng up lên Host và thử nghiệm
Nguồn: Sưu tầm Internet

Không có nhận xét nào:

Đăng nhận xét