Збереження зображення з URL-адреси PHP


402

Мені потрібно зберегти зображення з URL-адреси PHP на моєму ПК. Скажімо, у мене є сторінка, 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-адреси прийде нове зображення gif (“ example.com/image.php ”), то наш скрипт автоматично отримає нове зображення та збереже його у моєму каталозі?
riad

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']);.
Mathias Bynens

4
+1 за те, що я бачив єдину відповідь, що включає "b" для двійкового прапора.
Буде Морган

34
@vartec: тому що він палив сигарету і мав велику посмішку на обличчі :)
Jimbo

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

42
Надзвичайно елегантний (вимагає allow_url_fopen).
Iiridayn

Я не мав ходу, просто додав його, тому якщо в майбутньому на цю сторінку приїдуть користувачі, вони побачать :) Однак це дуже елегантне рішення
AlexMorley-Finch

60
Будь ласка, ігноруйте мої коментарі, ця функція чудово працює з прозорістю. У мене заголовки були жорсткими, як image / jpeg.
AlexMorley-Finch

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

3
@Monnster, ні, це не буде для звичайних файлових систем.
Halil Özgür

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

На сторінці зберігається анімоване зображення gif. Файл зберігається у папці як flower.gif. Але він порожній. Немає зображення show.any рішення?
riad

Увімкніть повідомлення про помилку (E_ALL | E_STRICT) і перевірте значення повернення file_get_contents (), тоді ви повинні отримати розумне повідомлення про помилку.
соумергер

Можливо, адміністратор сайту заборонив сторонні реферали. У цьому випадку ви можете спробувати stream_context_create () та встановити відповідні заголовки HTTP. us2.php.net/manual/en/function.stream-context-create.php
Calvin

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.
andrew

9
Як генерування зображення або розширення файлів взагалі має відношення до питання?
Sam152


@SamThompson з документації PHP це означає розмір шматка (зазвичай 8192).
Даан

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

25

Відповідь Vartec в с 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
дякую Зуул, дійсно & stoe дійсно знайшов корисність після більшого пошуку або витратити час
Ракеш Шарма

блискуче - це так допомогло! Слід зазначити і відповідь Vartecs
Нік

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

Створіть папку з назвою зображень, розташовану на шляху, який ви плануєте розмістити на скрипті php, який ви збираєтеся створити. Переконайтеся, що він має права на запис для всіх, або сценарії не працюватимуть (він не зможе завантажувати файли в каталог).


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

0

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.