Lưu hình ảnh từ URL PHP


402

Tôi cần lưu hình ảnh từ URL PHP vào PC. Giả sử tôi có một trang http://example.com/image.php, đang giữ một hình ảnh "hoa" duy nhất, không có gì khác. Làm cách nào tôi có thể lưu hình ảnh này từ URL bằng một tên mới (sử dụng PHP)?


1
Nếu sao chép một số lượng lớn hoặc kích thước tệp, lưu ý rằng các phương thức CURL là thích hợp hơn (như ví dụ thứ 2 trong câu trả lời được chấp nhận ) vì CURL mất khoảng một phần ba thời gian, file_put_contentsv.v.
ashleedawg

Câu trả lời:


712

Nếu bạn đã allow_url_fopenđặt thành true:

$url = 'http://example.com/image.php';
$img = '/my/folder/flower.gif';
file_put_contents($img, file_get_contents($url));

Khác sử dụng cURL :

$ch = curl_init('http://example.com/image.php');
$fp = fopen('/my/folder/flower.gif', 'wb');
curl_setopt($ch, CURLOPT_FILE, $fp);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_exec($ch);
curl_close($ch);
fclose($fp);

1
Cảm ơn bro, mã của bạn giúp tôi giải quyết vấn đề. Nhưng u có thể pls giúp tôi để làm cho kịch bản tự động .I bình khi một hình ảnh gif mới đến url ( “ example.com/image.php ”) sau đó kịch bản của chúng tôi tự động lấy hình ảnh mới và lưu nó vào thư mục của tôi?
riad

32
Và làm thế nào để bạn biết rằng hình ảnh mới "đến"?
vartec

2
Tôi nghĩ rằng riad có nghĩa là sử dụng một $_GETbiến chứa URL của hình ảnh http://example.com/fetch-image.php?url=http://blabla.com/flower.jpg. Trong trường hợp của ví dụ này, bạn chỉ có thể gọi $_GET['url']tập lệnh PHP của mình, như vậy : $ch = curl_init($_GET['url']);.
Mathias Bynens

4
+1 vì là câu trả lời duy nhất tôi thấy bao gồm "b" cho cờ nhị phân.
Will Morgan

34
@vartec: vì nó đang hút một điếu thuốc và có một nụ cười lớn trên khuôn mặt của nó :)
Jimbo

252
copy('http://example.com/image.php', 'local/folder/flower.jpg');

42
Vô cùng thanh lịch (yêu cầu allow_url_fopen).
Iiridayn

Tôi không có ý định, chỉ cần thêm nó để nếu có bất kỳ người dùng nào đến trang này trong tương lai, họ sẽ thấy :) Đó là một giải pháp rất thanh lịch
AlexMorley-Finch

60
Hãy bỏ qua ý kiến ​​của tôi, chức năng này hoạt động hoàn hảo với độ trong suốt. Tôi đã có tiêu đề của tôi được mã hóa cứng như hình ảnh / jpeg.
AlexMorley-Finch

2
Nếu thư mục đích không tồn tại, nó sẽ tự động được tạo?
Monnster

3
@Monnster, không, nó sẽ không dành cho các hệ thống tập tin bình thường.
Halil Özgür

69
$content = file_get_contents('http://example.com/image.php');
file_put_contents('/my/folder/flower.jpg', $content);

Trang này đang giữ một hình ảnh gif hoạt hình. Một tập tin được lưu trữ vào thư mục dưới dạng hoa.gif. Nhưng nó trống. Không có giải pháp hình ảnh nào.
riad

Bật error_Vporting (E_ALL | E_STRICT) và kiểm tra giá trị trả về của file_get_contents (), sau đó bạn sẽ nhận được thông báo lỗi hợp lý.
soulmerge

Có lẽ quản trị trang web đã cấm giới thiệu bên ngoài. Trong trường hợp đó, bạn có thể thử stream_context_create () và đặt các tiêu đề HTTP thích hợp. us2.php.net/manual/en/feft.stream-context-create.php
Calvin

urlencode (' example.com/image.php' ) == 'http% 3A% 2F% 2Fexample.com% 2Fimage.php', rõ ràng không phải là điều bạn muốn. Ngoài ra tập tin là nhị phân, cờ thích hợp cần phải được thiết lập.
vartec

4
Bit của một chủ đề cũ ... nhưng đừng quên quyền truy cập tệp cho thư mục bạn đang lưu vào. Chỉ lãng phí mười phút mà quên đi điều hiển nhiên.
Squiggs.

29

Ở đây bạn đi, ví dụ lưu hình ảnh từ xa vào image.jpg.

function save_image($inPath,$outPath)
{ //Download images from remote server
    $in=    fopen($inPath, "rb");
    $out=   fopen($outPath, "wb");
    while ($chunk = fread($in,8192))
    {
        fwrite($out, $chunk, 8192);
    }
    fclose($in);
    fclose($out);
}

save_image('http://www.someimagesite.com/img.jpg','image.jpg');

Các url kẻ là example.com/image.php . Lưu ý rằng đó là một hình ảnh được tạo bởi php không phải là một jpeg đơn giản.
andrew

9
Làm thế nào là việc tạo ra hình ảnh hoặc phần mở rộng tập tin có liên quan đến câu hỏi?
Sam52

fopen cần allow_url_fopen = 1 quá
zloctb

@SamThndry từ tài liệu PHP có nghĩa là kích thước khối (thường là 8192).
Daan

AFAIK fread có thể trả lại đoạn ngắn hơn 8K yêu cầu. Bạn không cần tính chiều dài chunk hiệu quả cho fwrite?
Sergey

25

Câu trả lời của Vartec với cURL không hiệu quả với tôi. Nó đã làm, với một sự cải thiện nhẹ do vấn đề cụ thể của tôi.

ví dụ,

Khi có một chuyển hướng trên máy chủ (như khi bạn đang cố lưu hình ảnh hồ sơ facebook), bạn sẽ cần bộ tùy chọn sau:

curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);

Giải pháp đầy đủ trở thành:

$ch = curl_init('http://example.com/image.php');
$fp = fopen('/my/folder/flower.gif', 'wb');
curl_setopt($ch, CURLOPT_FILE, $fp);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_exec($ch);
curl_close($ch);
fclose($fp);

1
cảm ơn zuul, thực sự & stoe thực sự thấy hữu ích sau khi tìm kiếm hoặc dành nhiều thời gian hơn
Rakesh Sharma

rực rỡ - điều đó đã giúp rất nhiều! Cũng cần lưu ý về câu trả lời của Vartecs
Nick

10

Tôi không thể sử dụng bất kỳ giải pháp nào khác để làm việc, nhưng tôi đã có thể sử dụng wget:

$tempDir = '/download/file/here';
$finalDir = '/keep/file/here';
$imageUrl = 'http://www.example.com/image.jpg';

exec("cd $tempDir && wget --quiet $imageUrl");

if (!file_exists("$tempDir/image.jpg")) {
    throw new Exception('Failed while trying to download image');
}

if (rename("$tempDir/image.jpg", "$finalDir/new-image-name.jpg") === false) {
    throw new Exception('Failed while trying to move image file from temp dir to final dir');
}

giải pháp này cũng là người duy nhất làm việc cho tôi. Cảm ơn Andrew!
sentinel777


3
$img_file='http://www.somedomain.com/someimage.jpg'

$img_file=file_get_contents($img_file);

$file_loc=$_SERVER['DOCUMENT_ROOT'].'/some_dir/test.jpg';

$file_handler=fopen($file_loc,'w');

if(fwrite($file_handler,$img_file)==false){
    echo 'error';
}

fclose($file_handler);

1

Tạo một thư mục có tên hình ảnh nằm trong đường dẫn bạn định đặt tập lệnh php mà bạn sắp tạo. Đảm bảo rằng nó có quyền ghi cho mọi người hoặc các tập lệnh sẽ không hoạt động (nó sẽ không thể tải các tệp vào thư mục).


0
$data = file_get_contents('http://example.com/image.php');
$img = imagecreatefromstring($data);
imagepng($img, 'test.png');

0

cài đặt wkhtmltoimage trên máy chủ của bạn, sau đó sử dụng gói packagist.org/packages/tohidhabiby/htmltoimage của tôi để tạo hình ảnh từ url của mục tiêu.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.