- shares
- Facebook Messenger
- Gmail
- Viber
- Skype
Tải dữ liệu động là một tính năng hay một thư viện được tích hợp vào hầu hết các ngôn ngữ lập trình. Ví dụ Trong lập trình website bạn có thể tải dữ liệu binary file và file chứa nội dung văn bản mà không cần load trang với jquery ajax hay sử dụng thư viện CURL cho ngôn ngữ lập trình web động PHP, và các ngôn ngữ khác.
CURL có khá nhiều tính năng không chỉ giúp chúng ta lấy nội dung của mọi website, không sợ vấn đề cross-domain như javascript XHR. ví dụ về ứng dụng đơn giản của CURL là lấy thông tin của website khác đưa về làm nội dung trên website của bạn, xem đoạn code mẫu hướng dẫn chèn tỷ giá vào website.
Bạn có thể làm mọi thứ với CURL, chỉ bằng cách thiết lập tham số thích hợp để thực hiện các công việc với mục đích sử dụng khác nhau. Và bài hôm nay mình sẽ trình bầy cách download file thông qua CURL PHP.
Có 2 tham số CURL quan trọng CURLOPT_BUFFERSIZE
và CURLOPT_FILE
, thuộc tính này khai báo kích thước của file cần lấy nội dung và nguồn file.
$ch = curl_init(); $url="http://upload.wikimedia.org/wikipedia/commons/c/cf/Frog_on_river_4000x3000_26-09-2010_11-01am_2mb.jpg"; $filename = 'file1.jpg'; $file = fopen($filename,'w'); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_BUFFERSIZE,64000); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); curl_setopt($ch, CURLOPT_FRESH_CONNECT, TRUE); //not cache curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_FAILONERROR, true); curl_setopt($ch, CURLOPT_FILE, $file); curl_setopt($ch, CURLOPT_PROGRESSFUNCTION, 'progress1'); curl_setopt($ch, CURLOPT_NOPROGRESS, false); // needed to make progress function work curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']); $html = curl_exec($ch); curl_close($ch);
Ở phiên bản php 5.3 trở đi hỗ trợ sự kiện progress để thông báo quá trình tải dữ liệu file, số bytes đã tải xong và tổng dung lượng file do đó bạn dễ dàng tính ra phần trăm còn lại là bao nhiêu. Khai báo hàm liên kết vào tham số CURLOPT_PROGRESSFUNCTION có nội dung như sau.
function progress1($download_size, $downloaded, $upload_size, $uploaded) { if($download_size > 0){ $percent = intval($downloaded / $download_size * 100)."%"; echo '<script>document.getElementById("progress").innerHTML="<div style=\"width:'.$percent.';background-color:#ddd;\"> '.$percent.'</div>";</script>'; } ob_flush(); flush(); // sleep(3); // just to see effect }
Thêm chuỗi hiển thị thông báo vào đầu file trước khi sử lý URL trên trình duyệt, những dòng chữ bạn thêm vào file sẽ hiển thị bằng cách flush vào sau nội dung chuỗi.
echo "<pre>"; echo "Loading ..."; ob_flush(); flush(); ......thêm các đoạn code ở trên vào đây----- ob_flush(); flush();
Mình đã chạy thử và kết quả hoạt động đúng như mong muốn. Chú ý: thuộc tính CURLOPT_BUFFERSIZE
là dung lượng tối đa có thể tải file, nếu CURL không hoạt động bạn nên điều chỉnh lại giá trị thuộc tính này cho phù hợp với file đã thiết lập bởi CURLOPT_URL
.
Demo:
Hãy cho mình biết suy nghĩ của bạn trong phần bình luận bên dưới bài viết này. Hãy theo dõi kênh chia sẻ kiến thức WordPress của Hoangweb trên Twitter và Facebook
- shares
- Facebook Messenger
- Gmail
- Viber
- Skype
Caillou says
Bạn ơi có thể share lại file này không? Mình tải không được 🙂