Đây mà vấn đề mình gặp gần đây đối với một project đ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 luôn. Tuy không phải là một vấn đề mới nhưng tin rằng cũng có nhiều lập trình viên mất một quá trình tìm tòi, mò mẫn giống như mình.
Phụ mục
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 web 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 host khác (với cả domain 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:
[php] <?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);
}
}
?>
[/php]Đoạn mã trên được tôi tìm kiếm và tìm thấy trong phpclasses do một người nước ngoài viết nên chẳng dám vơ đũa là của mình nhé :)
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 host
[php] 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();
[/php] Ở đâ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
[php]
require_once("class.ftp".PHP_EX);
$ftp = new ClsFTP($FTP_username,$FTP_password, $hostname);
if (@getimagesize("http://nhanweb.com/file_to_delele.jpg")) {
$ftp->delete("file_to_delele.jpg");
}
$ftp->close();
[/php]
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
[php]
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();
[/php]
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 thành công…