Сохранение изображения из 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);
Vartec
источник
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);
soulmerge
источник
Страница содержит анимированное изображение 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');
Sam152
источник
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);
stoefln
источник
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
4

Смотрите file()руководство по PHP :

$url    = 'http://mixednews.ru/wp-content/uploads/2011/10/0ed9320413f3ba172471860e77b15587.jpg';
$img    = 'miki.png';
$file   = file($url);
$result = file_put_contents($img, $file)
zloctb
источник
2
need allow_url_fopen = On
zloctb
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 вашей цели.

TohidHabiby
источник