Сохранение изображения из PHP URL


402

Мне нужно сохранить изображение с PHP-URL на мой компьютер. Допустим, у меня есть страница http://example.com/image.phpс изображением одного цветка, и ничего больше. Как я могу сохранить это изображение из URL с новым именем (используя PHP)?


1
Если вы копируете большое количество или размер файлов, обратите внимание, что методы CURL предпочтительны (как 2-й пример в принятом ответе ), поскольку CURL занимает примерно треть времени, как file_put_contentsи т. Д.
— ashleedawg

Ответы:


712

Если вы allow_url_fopenустановили true:

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

Еще используйте 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
Спасибо, брат, твой код поможет мне решить проблему. Но не могли бы вы помочь мне сделать скрипт автоматизированным. Я имею в виду, когда новое URL-изображение приходит на URL (« example.com/image.php »), тогда наш скрипт автоматически выбирает новое изображение и сохраняет его в моем каталоге?
— Риад

32
А откуда вы знаете, что новый образ «пришел»?
— vartec

2
Я думаю, что riad означает использование $_GETпеременной, содержащей URL-адрес изображения http://example.com/fetch-image.php?url=http://blabla.com/flower.jpg. В случае данного примера, вы можете просто позвонить $_GET['url']в ваш PHP скрипт, например , так: $ch = curl_init($_GET['url']);.
— Матиас Биненс

4
+1 за единственный ответ, который я видел, который включает «b» для двоичного флага.
— Уилл Морган

34
@vartec: потому что он курил сигарету и имел широкую улыбку на лице :)
— Джимбо

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

42
Чрезвычайно элегантный (требуется allow_url_fopen).
— Ииридайн

Я не собирался идти, просто добавлял его, так что если какие-то пользователи придут на эту страницу в будущем, они увидят :) Это, однако, очень элегантное решение
— AlexMorley-Finch

60
Пожалуйста, игнорируйте мои комментарии, эта функция прекрасно работает с прозрачностью. Мои заголовки были жестко запрограммированы как image / jpeg.
— AlexMorley-Finch

2
если целевая папка не существует, будет ли она автоматически создана?
— Монстер

3
@Monnster, нет, не для обычных файловых систем.
— Халил Озгюр

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

Страница содержит анимированное изображение GIF. Файл хранится в папке как flower.gif. Но он пуст. Нет изображения. Какое решение?
— Риад

Включите error_reporting (E_ALL | E_STRICT) и проверьте возвращаемое значение file_get_contents (), тогда вы должны получить разумное сообщение об ошибке.
— soulmerge

Возможно, администратор сайта запретил сторонних рефералов. В этом случае вы можете попробовать stream_context_create () и установить соответствующие заголовки HTTP. us2.php.net/manual/en/function.stream-context-create.php
— Кальвин,

urlencode (' example.com/image.php' ) == 'http% 3A% 2F% 2Fexample.com% 2Fimage.php', очевидно, не то, что вы хотите. Также файл является двоичным, должен быть установлен соответствующий флаг.
— vartec

4
Немного о старом потоке ... но не забывайте права доступа к файлам для каталога, в который вы сохраняете. Просто потратил десять минут, забыв очевидное.
— Сквиггс.

29

Вот, пожалуйста, пример сохраняет удаленное изображение в 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');

URL парней - example.com/image.php . Обратите внимание, что это изображение, сгенерированное php, а не простой jpeg.
— Андрей

9
Как генерация изображения или расширение файла вообще имеют отношение к вопросу?
— Sam152

fopen тоже нужно allow_url_fopen = 1
— zloctb

@SamThompson из документации PHP означает размер куска (обычно 8192).
— Daan

AFAIK fread может вернуть более короткий кусок, чем запрошенный 8K. Вам не нужно рассчитывать эффективную длину фрагмента для fwrite?
— Сергей

25

Ответ Вартека с cURL у меня не сработал. Это произошло с небольшим улучшением из-за моей конкретной проблемы.

например,

Когда на сервере происходит перенаправление (например, когда вы пытаетесь сохранить изображение профиля в Facebook), вам понадобится следующий набор параметров:

curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);

Полное решение становится:

$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
спасибо zuul, действительно & stoe действительно нашел полезным после большего количества поиска или провести время
— Ракеш Шарма

блестяще - это очень помогло! Следует отметить и ответ Вартека
— Ник

10

Мне не удалось заставить работать другие решения, но я смог использовать 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');
}

это решение было также единственным, который работал для меня. Спасибо, Андрей!
— 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

Создайте папку с именем images, расположенную по пути, который вы планируете разместить в php-скрипте, который собираетесь создать. Убедитесь, что у него есть права на запись для всех, иначе сценарии не будут работать (он не сможет загружать файлы в каталог).


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

0

установите wkhtmltoimage на свой сервер, а затем используйте мой пакет packagist.org/packages/tohidhabiby/htmltoimage для создания изображения по URL вашей цели.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.