Сохранение изображения из 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.