Kết nối, thao tác FTP và thao tác PHP

Đây mà vấn đề mình gặp gần đây đối với một dự án đang thực hiện nên sẵn tiện mình viết bài này chia sẻ với mọi người về việc kết nối và sử dụng FTP trên PHP. Tuy không phải là một vấn đề mới nhưng tin rằng cũng có nhiều coder mất một quá trình tìm tòi, mò mẫn giống như tôi.

– Tại sao phải sử dụng FTP ?

Câu hỏi này có lẽ bình thường chúng ta sẽ không hỏi đến dù bạn là lập trình viên. Bởi thông thường trong quá trình tạo dựng một website chúng ta thường chứa các file lưu lên cùng một thư mục với bộ mã nguồn của website.

Vậy sẽ thao tác như thế nào nếu host chứa file dữ liệu không nằm cùng với host chứa mã nguồn website ?

Điều này thường gặp nếu host chạy website của bạn không chứa được xây dựng để chứa những file có dung lượng lớn hoặc do nhu cầu sử dụng CDN mà bạn bắt buộc phải chứa những hình ảnh hoặc file ở một nơi khác. Tôi ví dụ như website Amazon: họ chứa toàn bộ hình ảnh sản phẩm ở một hosting khác:

http://ecx.images-amazon.com/images/I/51Ld6Qa5tFL._SL135_.jpg

Trong trường hợp này, kĩ thuật sử dụng FTP sẽ được dùng tới để có thể tải ảnh hoặc file lên một hosting khác (với cả tên miền khác) nhưng vẫn đảm bảo rằng người dùng có thể upload ảnh bằng công cụ được lập trình sẵn trên website.

Tiến hành

Chúng ta cần tiến hành một số công việc sau:

1 – Viết class FTP

Trước tiên bạn viết 1 class FTP như sau:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
<?php
//////////////////////////////////////////////////
//ftp class
//author:paul.ren
//e-mail:rsr_cn@yahoo.com.cn
//website:www.yawill.com
//create:2004-6-23 09:22
//modify:
//////////////////////////////////////////////////
class ClsFTP{
    var $host = "localhost";//FTP HOST
    var $port = "21";        //FTP port
    var $user = "Anonymous";//FTP user
    var $pass = "Email";    //FTP password
    var $link_id = "";        //FTP hand
    var $is_login = "";        //is login
    var $debug = 1;
    var $local_dir = "";    //local path for upload or download
    var $rootdir = "";        //FTP root path of FTP server
    var $dir = "/";            //FTP current path
    function ClsFTP($user="Anonymous",$pass="Email",$host="localhost",$port="21"){
        if($host) $this->host = $host;
        if($port) $this->port = $port;
        if($user) $this->user = $user;
        if($pass) $this->pass = $pass;
        $this->login();
        $this->rootdir     = $this->pwd();
        $this->dir         = $this->rootdir;
    }
    function halt($msg,$line=__LINE__){
        echo "FTP Error in line:$line<br/>\n";
        echo "FTP Error message:$msg<br/>\n";
        exit();
    }
    function login(){
        if(!$this->link_id){
            $this->link_id = ftp_connect($this->host,$this->port) or $this->halt("can not connect to host:$this->host:$this->port",__LINE__);
        }
        if(!$this->is_login){
            $this->is_login = ftp_login($this->link_id, $this->user, $this->pass) or $this->halt("ftp login faild.invaid user or password",__LINE__);
        }
    }
    function systype(){
        return ftp_systype($this->link_id);
    }
    function pwd(){
        $this->login();
        $dir = ftp_pwd($this->link_id);
        $this->dir = $dir;
        return $dir;
    }
    function cdup(){
        $this->login();
        $isok =  ftp_cdup($this->link_id);
        if($isok) $this->dir = $this->pwd();
        return $isok;
    }
    function cd($dir){
        $this->login();
        $isok = ftp_chdir($this->link_id,$dir);
        if($isok) $this->dir = $dir;
        return $isok;
    }
    function nlist($dir=""){
        $this->login();
        if(!$dir) $dir = ".";
        $arr_dir = ftp_nlist($this->link_id,$dir);
        return $arr_dir;
    }
    function rawlist($dir="/"){
        $this->login();
        $arr_dir = ftp_rawlist($this->link_id,$dir);
        return $arr_dir;
    }
    function mkdir($dir){
        $this->login();
        return @ftp_mkdir($this->link_id,$dir);
    }
    function file_size($file){
        $this->login();
        $size = ftp_size($this->link_id,$file);
        return $size;
    }
    function chmod($file,$mode=0666){
        $this->login();
        return ftp_chmod($this->link_id,$file,$mode);
    }
    function delete($remote_file){
        $this->login();
        return ftp_delete($this->link_id,$remote_file);
    }
    function get($local_file,$remote_file,$mode=FTP_BINARY){
        $this->login();
        return ftp_get($this->link_id,$local_file,$remote_file,$mode);
    }
    function put($remote_file,$local_file,$mode=FTP_BINARY){
        $this->login();
        return ftp_put($this->link_id,$remote_file,$local_file,$mode);
    }
    function put_string($remote_file,$data,$mode=FTP_BINARY){
        $this->login();
        $tmp = "/tmp";//ini_get("session.save_path");
        $tmpfile = tempnam($tmp,"tmp_");
        $fp = @fopen($tmpfile,"w+");
        if($fp){
            fwrite($fp,$data);
            fclose($fp);
        }else return 0;
        $isok = $this->put($remote_file,$tmpfile,FTP_BINARY);
        @unlink($tmpfile);
        return $isok;
    }
    function p($msg){
        echo "<pre>";
        print_r($msg);
        echo "</pre>";
    }
    function close(){
        @ftp_quit($this->link_id);
    }
}
?>

– Sử dụng class FTP như thế nào ?

Dưới đây là một vài cách bạn có thể ứng dụng sử dụng:

1 – Upload một file lên hosting

1
2
3
4
5
require_once("class.ftp".PHP_EX);
$ftp = new ClsFTP($FTP_username,$FTP_password, $hostname);
//Upload lên host
$ftp->put($dir_image_to.$filename, 'file_duoc_up.jpg');//put file
$ftp->close();

Ở đây bạn chú ý là $filename sẽ là file được đặt tên trên host, còn file file_duoc_up.jpg sẽ là file đang nằm trên host chứa mã nguồn. Ngoài ra, nếu sử dụng hệ thống upload bạn có thể sử dụng biến $_FILES[‘uploadfile’][‘tmp_name’] để tải lên.

2 – Xóa một file

1
2
3
4
5
6
require_once("class.ftp".PHP_EX);
$ftp = new ClsFTP($FTP_username,$FTP_password, $hostname);
if (@getimagesize("http://thietkeso.vn/file_to_delele.jpg")) {
        $ftp->delete("file_to_delele.jpg");
    }
$ftp->close();

Hành động getimagesize thực ra không dùng để lấy kích thước, chúng ta chỉ sử dụng hành động này để xác định file có tồn tại hay không từ đó xóa nó đi thôi. Các bạn chú ý là cần kiểm tra trước khi xóa để không gây lỗi nhé.

3 – Tạo một thư mục

Dòng lệnh dưới đây sẽ kiểm tra thư mục đã tồn tại hay chưa, nếu chưa tồn tại thì sẽ tạo một thư mục

1
2
3
4
5
6
7
require_once("class.ftp".PHP_EX);
$ftp = new ClsFTP($FTP_username,$FTP_password, $hostname);
//Tao thu muc
if(!is_dir($path_to_folder)) ){
  $ftp->mkdir($path_to_folder);
}
$ftp->close();

Trên đây là một vài các sử dụng class FTP mà tôi đã chia sẻ ở trên, các bạn xem thêm và tự sử dụng nhé. Hi vọng bài viết này giải quyết được phần nào khó khăn mà các lập trình viên nhà ta hay gặp phải.

Chúc các bạn thành công,

FOLLOW US

Leave a Reply

Your email address will not be published. Required fields are marked *