[PHP] Download và lưu file ảnh từ website khác

Khi lướt web bắt gặp những file ảnh đẹp, bắt mắt thì chúng ta thường hay lưu về máy để lưu trữ hoặc dùng vào mục đích khác. Trong bài viết hôm nay tôi sẽ giới thiệu một số cách từ đơn giản đến phức tạp để tự động download một hoặc nhiều file ảnh khác nhau từ các website trên mạng.

Tất cả code tôi sử dụng chủ yếu dựa vào cURL để đọc nội dung và lấy thông tin file ảnh. Các bạn có thể tham khảo thêm các bài viết về cURL dưới đây :

1, Download và lưu một file ảnh

Đoạn code dưới đây sẽ download 1 file ảnh và lưu về cùng thư mục với file hiện tại.

<?php
$url = "http://curl.phptrack.com/images/header.jpg";
$ch = curl_init();
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_BINARYTRANSFER, 1);
curl_setopt($ch, CURLOPT_URL, $url);
$result = curl_exec($ch);
curl_close($ch);
// Lưu file ảnh
$fullpath = basename($url);
if (file_exists($fullpath)) {
unlink($fullpath);
}
$fp = fopen($fullpath, 'x');
fwrite($fp, $result);
fclose($fp);
?>

2, Download và lưu nhiều file ảnh

Với trường hợp nhiều file ảnh thì các bạn chỉ cần đưa đường dẫn vào một mảng (array) và thực hiện trong vòng lặp tương tự như với 1 file ảnh. Cụ thể như sau :

<?php
$img[] = 'http://i.indiafm.com/stills/celebrities/sada/thumb1.jpg';
$img[] = 'http://i.indiafm.com/stills/celebrities/sada/thumb5.jpg';
foreach ($img as $i) {
save_image($i);
if (getimagesize(basename($i))) {
echo '<h3 style="color: green;">Image ' . basename($i) . ' Downloaded OK</h3>';
} else {
echo '<h3 style="color: red;">Image ' . basename($i) . ' Download Failed</h3>';
}
}
function save_image($img, $fullpath = 'basename') {
if ($fullpath == 'basename') {
$fullpath = basename($img);
}
$ch = curl_init ($img);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_BINARYTRANSFER,1);
$rawdata = curl_exec($ch);
curl_close ($ch);
if (file_exists($fullpath)) {
unlink($fullpath);
}
$fp = fopen($fullpath, 'x');
fwrite($fp, $rawdata);
fclose($fp);
}
?>

3, Download và lưu file ảnh vào thư mục khác

Như đã nói ở trên, với 2 cách đầu tiên thì các file ảnh sẽ được lưu trong cùng thư mục với file hiện tại nhưng bạn có thể chọn lưu vào thư mục khác với đoạn code dưới đây.

Lưu ý: Bạn nên tạo thư mục mới tên là “images” cùng thư mục với file hiện tại trước khi thực thi mã lệnh.

<?php
$url = "http://www.w3schools.com/images/w3schoolslogo.gif";
$ch = curl_init();
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_BINARYTRANSFER, 1);
curl_setopt($ch, CURLOPT_URL, $url);
$result = curl_exec($ch);
curl_close($ch);
// Lưu file ảnh
$fullpath = basename($url);
if (file_exists($fullpath)) {
unlink($fullpath);
}
$fp = fopen($fullpath, 'x');
fwrite($fp, $result);
fclose($fp);
//Di chuyển file ảnh sang thư mục khác
rename($fullpath, "images/" . $fullpath);
?>

4, Download và lưu file ảnh mà tự động chuyển trang

Các đường dẫn file ảnh được lấy làm ví dụ ở những cách trên đều là đường dẫn tĩnh, không thay đổi nhưng nếu bạn muốn tự động download ảnh từ trang flick.com chẳng hạn thì bạn sẽ gặp một chút khó khăn bởi lẽ nếu bạn dùng đường dẫn http://static.flickr.com/2610/3911380499_e747697efe.jpg thì nó sẽ tự động chuyển sang đường dẫn mới là http://farm3.static.flickr.com/2610/3911380499_e747697efe.jpg . Sau khi tìm kiếm và đọc các bài viết trên mạng, tôi đã có được đoạn code giải quyết vấn đề trên.

<?php
$url = "http://static.flickr.com/2610/3911380499_e747697efe.jpg";
$ch = curl_init();
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_BINARYTRANSFER, 1);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_URL, $url);
$result = curl_exec($ch);
curl_close($ch);
// Lấy file ảnh
$fullpath = basename($url);
if (file_exists($fullpath)) {
unlink($fullpath);
}
$fp = fopen($fullpath, 'x');
fwrite($fp, $result);
fclose($fp);
?>

5, Mở rộng

Nếu bạn muốn xem trước file ảnh trước khi download về thì đoạn code sau sẽ giúp bạn.

<?php
$url = "http://curl.phptrack.com/images/header.jpg";
$ch = curl_init();
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_BINARYTRANSFER, 1);
curl_setopt($ch, CURLOPT_URL, $url);
$result = curl_exec($ch);
curl_close($ch);
header("Content-type: image/jpeg");
echo $result;
?>

6, Tổng kết

Những cách tôi vừa nêu ở trên chỉ là 1 phần nhỏ trong rất nhiều cách giúp bạn lấy và lưu trữ file ảnh. Qua đây các bạn có thể sức mạnh cũng như sự hữu ích của cURL trong việc lập trình web. Nếu có thời gian rãnh, các bạn hãy đọc các bài viết và nghiên cứu thêm cURL nhé. Thân !

Tấn Việt

Tôi lập trang web này để thỏa mãn sở thích viết cái gì đó vui vui khi rãnh rỗi và đồng thời cũng chia sẻ những gì tôi biết hoặc đọc đâu đó trên mạng về Lập trình web. Tôi hi vọng những bài viết này sẽ giúp ích cho các bạn. Thân ái!

You may also like…

1 Response

  1. Mr Viet says:

    Chào bạn, cho mình hỏi sao mình dùng ajax thì nó không tải được ảnh về, nếu chạy bình thường thì nó tải về được:

    $url = “http://noithathoaphat.com/product_images/y/678/ghe-luoi-phong-hop-hoa-phat-GL415__23185_thumb.jpg”;
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_HEADER, 0);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_BINARYTRANSFER, 1);
    curl_setopt($ch, CURLOPT_URL, $url);
    $result = curl_exec($ch);
    curl_close($ch);

    // Lưu file ảnh
    $fullpath = basename($url);
    if (file_exists($fullpath)) {
    unlink($fullpath);
    }
    $fp = fopen($fullpath, ‘x’);
    fwrite($fp, $result);
    fclose($fp);