Mẹo viết một code download để dấu link thật đến file

Có lẽ không thừa nếu như chúng ta tìm hiểu kỹ hơn một chút về lý do sử dụng một chương trình download manager trên website để giấu đường dẫn thực sự đến các file download.


Quản lý băng thông và “tài sản” là 2 lý do chính để sử dụng 1 chương trình quản lý download trên website. Bạn thử tưởng tượng có 1 website cho download nhạc hoặc ebook với 1 mức phí nho nhỏ, nếu mà link để download trực tiếp các file bị lộ tùm lum thì thứ nhất là “lỗ vốn”, thứ hai là bandwidth sẽ hết sạch nhanh đến nỗi trước khi bạn kịp hiểu chuyện gì đã xảy ra.
Một số lý do khác cũng “chính đáng” không kém ví dụ như bạn muốn đếm số lần download file; hoặc website của bạn tự upload file của mình lên và các file này lại nằm trong database hoặc được để trong 1 thư mục mà từ ngoài web không đọc được. Trong những trường hợp như vậy, sử dụng 1 chương trình quản lý download trên website sẽ khá tiện lợi.
Tuy nhiên, cũng có vài điều cần chú ý trước khi bạn quyết định sử dụng 1 chương trình quản lý download trên website của mình:

  • Tốc độ download sẽ chậm hơn rất nhiều so với download file trực tiếp.
  • Server sẽ phải xử lý nhiều công việc hơn so với khi cho phép download file trực tiếp.
  • Nếu file được lưu trữ trong database, bạn nên chú ý rằng số lượng kết nối đồng thời vào database là có hạn, trong khi với 1 file có dung lượng lớn, có thể phải mất tới nửa tiếng hoặc hơn để download.

Nội dung:
CHƯƠNG TRÌNH ĐẦU TIÊN
Giả sử bạn có 1 file document.zip trong cùng thư mục với file download.php. Nhưng chỉ mình bạn biết là file document.zip này nằm ở đâu, người khác muốn download thì phải truy cập vào file download.php của bạn. Mã nguồn của file download.php sẽ như sau:

PHP Code:
//file download.php
<?php
$filename
= "document.zip";
$fp = fopen($filename, "rb");
header("Content-type: application/octet-stream");
header("Content-length: " . filesize($filename));

fpassthru($fp);
fclose($fp);
?>

Ủa, chỉ có nhiêu đó thôi à? Đúng vậy, chỉ có vỏn vẹn 10 dòng là có được 1 chương trình download manager đơn giản (dĩ nhiên là chương trình này chỉ cho phép download được mỗi 1 file document.zip, ta còn phải làm việc nhiều để cho chương trình hoàn thiện hơn!).
Đầu tiên, ta mở file document.zip để đọc ở chế độ nhị phân (binary):

PHP Code:
$fp = fopen($filename, "rb");.

Tiếp theo ta báo cho browser biết data trả về từ server là dữ liệu nhị phân chứ không phải là văn bản HTMl như thông thường:

PHP Code:
header("Content-type: application/octet-stream");

.
Đồng thời ta cũng báo cho browser biết dung lượng của file sẽ được tải xuống:

PHP Code:
header("Content-length: " . filesize($filename));

.
Và cuối cùng là đọc nội dung file và echo lại cho browser download:

PHP Code:
fpassthru($fp);

.
Lệnh fpassthru($fp); tương đương với 2 lệnh:

PHP Code:
$content = fread($handle, filesize($filename));
echo
$content;

Như vậy chương trình này cũng không có gì khác với các chương trình PHP thông thường ngoài 2 lệnh header(). Trong đó lệnh

PHP Code:
header("Content-length: " . filesize($filename));

cũng không có gì là khó hiểu, lệnh này báo cho browser biết dung lượng của file chuẩn bị download (thực ra không có lệnh này thì quá trình download vẫn diễn ra như bình thường). Vấn đề mấu chốt nằm ở lệnh

PHP Code:
header("Content-type: application/octet-stream");

.
Lệnh

PHP Code:
header("Content-type: application/octet-stream");

sẽ báo cho browser biết là dữ liệu chuẩn bị load xuống là dữ liệu nhị phân. Vì là dữ liệu nhị phân nên browser sẽ thực hiện quá trình download và save file thay vì hiển thị lên browser như là 1 trang HTML thông thường.
Thử chạy ví dụ trên vài lần, thay thế file document.zip bằng một số file khác nhau (ví dụ file Word, PDF, Excel…) và thử trên vài browser khác nhau, bạn sẽ nhận thấy có vài chỗ hơi khó chịu:

  • Browser sẽ mặc định lưu file lên đĩa với tên là download.php. Bạn phải đổi tên file lại cho đúng trước khi mở file ra đọc.
  • Trong một số trường hợp, thay vì hỏi save file lên đĩa, browser sẽ mở luôn file (ví dụ chạy Word hoặc Acrobat mở luôn file vừa được download).

Để giải quyết 2 vấn đề khó chịu trên cũng không có gì khó khăn lắm, ta chỉ cần thêm 1 lệnh header() nữa:

PHP Code:
header('Content-disposition: attachment; filename="'.$filename.'"');

Tham số “attachment” của header “Content-disposition” sẽ báo cho browser biết là nên download và save file thay vì open. Tham số “filename=” sẽ báo cho browser biết tên của file đang được download. CẢI TIẾN CHƯƠNG TRÌNH
Cho tới bây giờ chương trình của chúng ta vẫn còn thô sơ, chúng ta vẫn cần them vào chức năng nữa để chương trình hoàn thiện hơn.

  • Cho phép người dùng chọn file để download. Hiện tại chương trình của chúng ta chỉ mới cho phép download 1 file duy nhất.
  • Kiểm tra dữ liệu nhập từ người dùng. Đây là một việc luôn nên làm. Chương trình cho phép nguời dùng chọn file để download thì cũng cần nên kiểm tra kỹ kẻo chính file config, file source hoặc file password của bạn bị download thì phiền.

Cho phép người dùng chọn file để download: Thao tác này có lẽ khá đơn giản đối với bạn. Chương trình sẽ nhận vào tham số file từ URL (ví dụ: download.php?file=document.zip). Đoạn code xử lý như sau:

PHP Code:
$filename = isset($_GET['file'])?$_GET['file']:'';

—————————————————————
——————-> BỔ SUNG BÀI VIẾT<——————–
—————————————————————
Kiểm tra dữ liệu nhập: Ta cần kiểm tra các điều kiện sau:

  • File có tồn tại và được phép đọc hay không? PHP cung cấp sẵn cho ta 2 hàm ls is_file() và is_readable() để làm việc này:
    PHP Code:
    if ( $filename == "" || !is_file($filename) || !is_readable($filename) ) {
    echo
    "Error: ...";
    exit(-
    1);
    }

    Đoạn mã trên sẽ kiểm tra nếu như tên file là rỗng, hoặc file không tồn tại hoặc không đọc được thì sẽ báo lỗi và thoát.

  • Tên file có chứa các ký tự đặt biệc hay không? Thường các file upload sẽ được để trong 1 thư mục riêng. Như vậy tên file chỉ có thể chứa các ký tự a-z, 0-9, gạch ngang (-), gạch dưới (_), khoảng trắng và dấu chấm (.). Ta có thể xem như các kỹ tự khác trong tên file là không hợp lệ. Đoạn mã kiểm tra như sau:
    PHP Code:
    if ( !preg_match('/^[a-z0-9_-. ]*$/i', $filename) ) {
    echo
    "Error: ...";
    exit(-
    1);
    }

    Đoạn mã trên sẽ kiểm tra nếu như trong file có chứa ký tự lạ (không phải là 0-9, a-z, gach dưới, gạch ngang, khoảng trắng, dấu chấm, khoảng trắng thì sẽ báo lỗi) và thoát chương trình. Ngoài ra, có một số file cấu hình đặt biệc của server được bắt đầu bằng dấu chấm (ví dụ .htaccess, .htpasswd), ta cũng phải kiểm tra xem ksy tự đầu tiên của tên file có phải là dấu chấm hay không, nói cách khác, ký tự đầu tiên của tên file phải là 1 chữ cái (a-z) hoặc chữ số (0-9) hoặc kỹ tự gạch ngang hoặc gạch dưới. Lệnh if trên được cài tiến lại như sau:

    PHP Code:
    if ( !preg_match('/^[a-z0-9_-][a-z0-9_-. ]*$/i', $filename) ) {
    echo
    "Error: ...";
    exit(-
    1);
    }

Giép lại ta có chương trình được cải tiến như sau:

PHP Code:
<?php
//các file upload được để trong 1 thư mục riêng
$upload_dir = "../upload/";
//lấy tên file cần download từ URL
$filename = isset($_GET['file'])?$_GET['file']:'';

//thực hiện quá trình kiểm tra
if ( !preg_match('/^[a-z0-9_-][a-z0-9_-. ]*$/i', $filename) )
|| !
is_file($upload_dir.$filename) || !is_readable($upload_dir.$filename) ) {
echo
"Loi: Ten file khong hop le hoac file khong ton tai!";
exit(-
1);
}
//end if
//mở file để đọc với chế độ nhị phân (binary)

$fp = fopen($upload_dir.$filename, "rb");

//gởi header đến cho browser
header('Content-type: application/octet-stream');
header('Content-disposition: attachment; filename="'.$filename.'"');
header('Content-length: ' . filesize($upload_dir.$filename));

//đọc file và trả dữ liệu về cho browser
fpassthru($fp);
fclose($fp);

Lưu ý rằng ta không cần kiểm tra tên file rỗng nữa vì ở trên ta đã kiểm tra ký tự đầu tiên của tên file, nên nếu tên file lã rỗng thì sẽ không có ký tự đầu tiên, do vậy điều kiện kiểm tra của hàm pregg_match sẽ bị sai rồi. THẮC MẮC NHỎ CUỐI CÙNG
Tới đây xem như chương trình của chúng ta xem như là đã hoàn chỉnh. Tuy nhiên, có thể bạn sẽ còn một thắc mắc nho nhỏ: ngoài kiểu dữ liệu application/octet-stream thì còn kiểu dữ liệu nào khác không? và mặc định thì PHP sẽ dùng kiểu dữ liệu gì để trả về cho browser?
Mặc định PHP sẽ trả về dữ liệu kiểu text/html cho browser. Một số kiểu dữ liệu tương ứng với các kiểu file thông dụng:
.GIF: image/gif
.JPG: image/jpeg
.PNG: image/png
.WAV: audio/wav
.MP3: audio/mpeg3
.DOC: application/msword
.PDF: application/pdf
Tuỳ vào kiểu của dữ liệu trả về mà browser có thể sẽ có những cách ứng khác nhau. Ví dụ nếu dữ liệu trả về là file ảnh thì browser sẽ hiển thị luôn, nếu là file nhạc thì browser sẽ gọi WMP lên để play, nếu là file PDF thì chương trình Acrobat sẽ được gọi…
Kiểu application/octet-stream để chỉ dữ liệu nhị phân (binary) chung chung. Nếu bạn chỉ muốn browser download và save file thì bạn chỉ cần trả về kiểu dữ liệu application/octet-stream là đủ.
Vậy thì nảy sinh 1 vấn đề nữa: tìm danh sách các kiểu dữ liệu tương ứng với từng loại file ở đâu? Google là trợ thủ đắt lực của bạn ;-) Hoặc bạn có thể xem mục “CÁC TÀI LIỆU THAM KHẢO” ở cuối bài viết.
VÀI LỜI NGỎ TRƯỚC KHI KẾT THÚC
Sau khi đọc hết bài viết, chắc bạn cũng thấy rằng việc viết 1 chương trình quản lý download file cho website cũng không phải là quá phức tạp. Cũng như tiêu đề của bài viết đã nói “Việt một chương trình download manager đơn giản”, chương trình của chúng ta khá đơn giản nhưng cũng có đủ các chức năng cơ bản cần thiết. Các chức năng “tiền download” hoặc “hậu download” bạn có thể dễ dàng tự phát triển thêm tuỳ vào nhu cầu của bạn, ví dụ như tăng biến đếm số lần download của file, kiểm tra login trước khi cho download. Bạn chỉ cần chú ý một số điểm sau khi viết 1 chương trình download manager:

  • Để các file upload lên trong 1 thư mục riêng để dễ bề quản lý. Tốt nhất là để trong 1 thư mục không thể truy cập trực tiếp được từ Web mà chỉ có thể đọc bởi chương trình PHP của bạn.
  • Kiểm tra kỹ tên file được người dùng nhập vào.
  • Mở file để đọc ở chế độ nhị phân (binary). Bạn tham khảo thêm các tham số của hàm fread trong PHP.
  • Trả về kiểu dữ liệu của file và các thông số cần thiết khác qua lệnh header().
  • Nếu không thật sự cần thiết thì nên để đường dẫn download trực tiếp thay vì dùng download manager, vì như vậy sẽ download nhanh hơn và server ít phải xử lý thêm nhiều công việc.

Chúc bạn thành công!

TÀI LIỆU THAM KHẢO

Theo DDTH








Meo viet mot code download de dau link that den file


Co le khong thua neu nhu chung ta tim hieu ky hon mot chut ve ly do su dung mot chuong trinh download manager tren website de giau duong dan thuc su den cac file download.


Quan ly bang thong va “tai san” la 2 ly do chinh de su dung 1 chuong trinh quan ly download tren website. Ban thu tuong tuong co 1 website cho download nhac hoac ebook voi 1 muc phi nho nho, neu ma link de download truc tiep cac file bi lo tum lum thi thu nhat la “lo von”, thu hai la bandwidth se het sach nhanh den noi truoc khi ban kip hieu chuyen gi da xay ra.
Mot so ly do khac cung “chinh dang” khong kem vi du nhu ban muon dem so lan download file; hoac website cua ban tu upload file cua minh len va cac file nay lai nam trong database hoac duoc de trong 1 thu muc ma tu ngoai web khong doc duoc. Trong nhung truong hop nhu vay, su dung 1 chuong trinh quan ly download tren website se kha tien loi.
Tuy nhien, cung co vai dieu can chu y truoc khi ban quyet dinh su dung 1 chuong trinh quan ly download tren website cua minh:

  • Toc do download se cham hon rat nhieu so voi download file truc tiep.
  • Server se phai xu ly nhieu cong viec hon so voi khi cho phep download file truc tiep.
  • Neu file duoc luu tru trong database, ban nen chu y rang so luong ket noi dong thoi vao database la co han, trong khi voi 1 file co dung luong lon, co the phai mat toi nua tieng hoac hon de download.

Noi dung:
CHUONG TRINH DAU TIEN
Gia su ban co 1 file document.zip trong cung thu muc voi file download.php. Nhung chi minh ban biet la file document.zip nay nam o dau, nguoi khac muon download thi phai truy cap vao file download.php cua ban. Ma nguon cua file download.php se nhu sau:

PHP Code:
//file download.php
<?php
$filename
= "document.zip";
$fp = fopen($filename, "rb");
header("Content-type: application/octet-stream");
header("Content-length: " . filesize($filename));

fpassthru($fp);
fclose($fp);
?>

Ua, chi co nhieu do thoi a? Dung vay, chi co von ven 10 dong la co duoc 1 chuong trinh download manager don gian (di nhien la chuong trinh nay chi cho phep download duoc moi 1 file document.zip, ta con phai lam viec nhieu de cho chuong trinh hoan thien hon!).
Dau tien, ta mo file document.zip de doc o che do nhi phan (binary):

PHP Code:
$fp = fopen($filename, "rb");.

Tiep theo ta bao cho browser biet data tra ve tu server la du lieu nhi phan chu khong phai la van ban HTMl nhu thong thuong:

PHP Code:
header("Content-type: application/octet-stream");

.
Dong thoi ta cung bao cho browser biet dung luong cua file se duoc tai xuong:

PHP Code:
header("Content-length: " . filesize($filename));

.
Va cuoi cung la doc noi dung file va echo lai cho browser download:

PHP Code:
fpassthru($fp);

.
Lenh fpassthru($fp); tuong duong voi 2 lenh:

PHP Code:
$content = fread($handle, filesize($filename));
echo
$content;

Nhu vay chuong trinh nay cung khong co gi khac voi cac chuong trinh PHP thong thuong ngoai 2 lenh header(). Trong do lenh

PHP Code:
header("Content-length: " . filesize($filename));

cung khong co gi la kho hieu, lenh nay bao cho browser biet dung luong cua file chuan bi download (thuc ra khong co lenh nay thi qua trinh download van dien ra nhu binh thuong). Van de mau chot nam o lenh

PHP Code:
header("Content-type: application/octet-stream");

.
Lenh

PHP Code:
header("Content-type: application/octet-stream");

se bao cho browser biet la du lieu chuan bi load xuong la du lieu nhi phan. Vi la du lieu nhi phan nen browser se thuc hien qua trinh download va save file thay vi hien thi len browser nhu la 1 trang HTML thong thuong.
Thu chay vi du tren vai lan, thay the file document.zip bang mot so file khac nhau (vi du file Word, PDF, Excel…) va thu tren vai browser khac nhau, ban se nhan thay co vai cho hoi kho chiu:

  • Browser se mac dinh luu file len dia voi ten la download.php. Ban phai doi ten file lai cho dung truoc khi mo file ra doc.
  • Trong mot so truong hop, thay vi hoi save file len dia, browser se mo luon file (vi du chay Word hoac Acrobat mo luon file vua duoc download).

De giai quyet 2 van de kho chiu tren cung khong co gi kho khan lam, ta chi can them 1 lenh header() nua:

PHP Code:
header('Content-disposition: attachment; filename="'.$filename.'"');

Tham so “attachment” cua header “Content-disposition” se bao cho browser biet la nen download va save file thay vi open. Tham so “filename=” se bao cho browser biet ten cua file dang duoc download. CAI TIEN CHUONG TRINH
Cho toi bay gio chuong trinh cua chung ta van con tho so, chung ta van can them vao chuc nang nua de chuong trinh hoan thien hon.

  • Cho phep nguoi dung chon file de download. Hien tai chuong trinh cua chung ta chi moi cho phep download 1 file duy nhat.
  • Kiem tra du lieu nhap tu nguoi dung. Day la mot viec luon nen lam. Chuong trinh cho phep nguoi dung chon file de download thi cung can nen kiem tra ky keo chinh file config, file source hoac file password cua ban bi download thi phien.

Cho phep nguoi dung chon file de download: Thao tac nay co le kha don gian doi voi ban. Chuong trinh se nhan vao tham so file tu URL (vi du: download.php?file=document.zip). Doan code xu ly nhu sau:

PHP Code:
$filename = isset($_GET['file'])?$_GET['file']:'';

—————————————————————
——————-> BO SUNG BAI VIET<——————–
—————————————————————
Kiem tra du lieu nhap: Ta can kiem tra cac dieu kien sau:

  • File co ton tai va duoc phep doc hay khong? PHP cung cap san cho ta 2 ham ls is_file() va is_readable() de lam viec nay:
    PHP Code:
    if ( $filename == "" || !is_file($filename) || !is_readable($filename) ) {
    echo
    "Error: ...";
    exit(-
    1);
    }

    Doan ma tren se kiem tra neu nhu ten file la rong, hoac file khong ton tai hoac khong doc duoc thi se bao loi va thoat.

  • Ten file co chua cac ky tu dat biec hay khong? Thuong cac file upload se duoc de trong 1 thu muc rieng. Nhu vay ten file chi co the chua cac ky tu a-z, 0-9, gach ngang (-), gach duoi (_), khoang trang va dau cham (.). Ta co the xem nhu cac ky tu khac trong ten file la khong hop le. Doan ma kiem tra nhu sau:
    PHP Code:
    if ( !preg_match('/^[a-z0-9_-. ]*$/i', $filename) ) {
    echo
    "Error: ...";
    exit(-
    1);
    }

    Doan ma tren se kiem tra neu nhu trong file co chua ky tu la (khong phai la 0-9, a-z, gach duoi, gach ngang, khoang trang, dau cham, khoang trang thi se bao loi) va thoat chuong trinh. Ngoai ra, co mot so file cau hinh dat biec cua server duoc bat dau bang dau cham (vi du .htaccess, .htpasswd), ta cung phai kiem tra xem ksy tu dau tien cua ten file co phai la dau cham hay khong, noi cach khac, ky tu dau tien cua ten file phai la 1 chu cai (a-z) hoac chu so (0-9) hoac ky tu gach ngang hoac gach duoi. Lenh if tren duoc cai tien lai nhu sau:

    PHP Code:
    if ( !preg_match('/^[a-z0-9_-][a-z0-9_-. ]*$/i', $filename) ) {
    echo
    "Error: ...";
    exit(-
    1);
    }

Giep lai ta co chuong trinh duoc cai tien nhu sau:

PHP Code:
<?php
//cac file upload duoc de trong 1 thu muc rieng
$upload_dir = "../upload/";
//lay ten file can download tu URL
$filename = isset($_GET['file'])?$_GET['file']:'';

//thuc hien qua trinh kiem tra
if ( !preg_match('/^[a-z0-9_-][a-z0-9_-. ]*$/i', $filename) )
|| !
is_file($upload_dir.$filename) || !is_readable($upload_dir.$filename) ) {
echo
"Loi: Ten file khong hop le hoac file khong ton tai!";
exit(-
1);
}
//end if
//mo file de doc voi che do nhi phan (binary)

$fp = fopen($upload_dir.$filename, "rb");

//goi header den cho browser
header('Content-type: application/octet-stream');
header('Content-disposition: attachment; filename="'.$filename.'"');
header('Content-length: ' . filesize($upload_dir.$filename));

//doc file va tra du lieu ve cho browser
fpassthru($fp);
fclose($fp);

Luu y rang ta khong can kiem tra ten file rong nua vi o tren ta da kiem tra ky tu dau tien cua ten file, nen neu ten file la rong thi se khong co ky tu dau tien, do vay dieu kien kiem tra cua ham pregg_match se bi sai roi. THAC MAC NHO CUOI CUNG
Toi day xem nhu chuong trinh cua chung ta xem nhu la da hoan chinh. Tuy nhien, co the ban se con mot thac mac nho nho: ngoai kieu du lieu application/octet-stream thi con kieu du lieu nao khac khong? va mac dinh thi PHP se dung kieu du lieu gi de tra ve cho browser?
Mac dinh PHP se tra ve du lieu kieu text/html cho browser. Mot so kieu du lieu tuong ung voi cac kieu file thong dung:
.GIF: image/gif
.JPG: image/jpeg
.PNG: image/png
.WAV: audio/wav
.MP3: audio/mpeg3
.DOC: application/msword
.PDF: application/pdf
Tuy vao kieu cua du lieu tra ve ma browser co the se co nhung cach ung khac nhau. Vi du neu du lieu tra ve la file anh thi browser se hien thi luon, neu la file nhac thi browser se goi WMP len de play, neu la file PDF thi chuong trinh Acrobat se duoc goi…
Kieu application/octet-stream de chi du lieu nhi phan (binary) chung chung. Neu ban chi muon browser download va save file thi ban chi can tra ve kieu du lieu application/octet-stream la du.
Vay thi nay sinh 1 van de nua: tim danh sach cac kieu du lieu tuong ung voi tung loai file o dau? Google la tro thu dat luc cua ban ;-) Hoac ban co the xem muc “CAC TAI LIEU THAM KHAO” o cuoi bai viet.
VAI LOI NGO TRUOC KHI KET THUC
Sau khi doc het bai viet, chac ban cung thay rang viec viet 1 chuong trinh quan ly download file cho website cung khong phai la qua phuc tap. Cung nhu tieu de cua bai viet da noi “Viet mot chuong trinh download manager don gian”, chuong trinh cua chung ta kha don gian nhung cung co du cac chuc nang co ban can thiet. Cac chuc nang “tien download” hoac “hau download” ban co the de dang tu phat trien them tuy vao nhu cau cua ban, vi du nhu tang bien dem so lan download cua file, kiem tra login truoc khi cho download. Ban chi can chu y mot so diem sau khi viet 1 chuong trinh download manager:

  • De cac file upload len trong 1 thu muc rieng de de be quan ly. Tot nhat la de trong 1 thu muc khong the truy cap truc tiep duoc tu Web ma chi co the doc boi chuong trinh PHP cua ban.
  • Kiem tra ky ten file duoc nguoi dung nhap vao.
  • Mo file de doc o che do nhi phan (binary). Ban tham khao them cac tham so cua ham fread trong PHP.
  • Tra ve kieu du lieu cua file va cac thong so can thiet khac qua lenh header().
  • Neu khong that su can thiet thi nen de duong dan download truc tiep thay vi dung download manager, vi nhu vay se download nhanh hon va server it phai xu ly them nhieu cong viec.

Chuc ban thanh cong!

TAI LIEU THAM KHAO

Theo DDTH

Mẹo viết một code download để dấu link thật đến file

Có lẽ không thừa nếu như chúng ta tìm hiểu kỹ hơn một chút về lý do sử dụng một chương trình download manager trên website để giấu đường dẫn thực sự đến các file download.
Giới thiệu cho bạn bè
  • gplus
  • pinterest

Bình luận

Đăng bình luận

Đánh giá