PHP URLからの画像の保存


402

PHP URLからPCに画像を保存する必要があります。http://example.com/image.php「花」の画像を1つだけ保持しているページがあるとします。この画像を新しい名前で(PHPを使用して)URLから保存するにはどうすればよいですか?


1
大量またはファイルのサイズ、メモをコピーする場合にCURLの方法は、(中2例のように好ましい受け入れ答えとして)カールのような時間の約3分かかり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
ありがとう、あなたのコードは問題を解決するのに役立ちます。しかし、スクリプトを自動化するのに役立つかもしれません。つまり、新しいgif画像がURL(「example.com/image.php」)に到達すると、スクリプトが自動的に新しい画像を取得してディレクトリに保存しますか?
リヤド

32
そして、どのようにして、新しいイメージが「実現した」とわかりますか?
vartec 2009

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、2009年

4
バイナリフラグの「b」を含む唯一の回答である+1。
モーガン

34
@vartec:たばこを吸っていて、顔に大きな笑顔がありました:)
神保

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

42
非常にエレガントです(が必要ですallow_url_fopen)。
Iiridayn 2011

私は試してみませんでした。追加するだけで、将来このページにアクセスしたユーザーには表示されます:)しかし、これは非常にエレガントなソリューションです
AlexMorley-Finch

60
私のコメントは無視してください。この機能は透明度で完全に機能します。ヘッダーをimage / jpegとしてハードコーディングしました。
AlexMorley-Finch

2
ターゲットフォルダが存在しない場合、自動的に作成されますか?
Monnster 2015

3
@Monnster、いや、それは通常のファイルシステムには当てはまりません。
HalilÖzgür、2015

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 2009

おそらく、サイト管理者は外部からの紹介を禁止しました。その場合は、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 2009

4
少し古いスレッド...しかし、保存先のディレクトリのファイル権限を忘れないでください。明らかなことを忘れてちょうど10分を無駄にしました。
Squiggs。

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、2011年

fopenにはallow_url_fopen = 1も必要です
zloctb

PHPドキュメントの @SamThompsonは、チャンクサイズ(通常は8192)を意味します。
Daan

AFAIK freadは、要求された8Kより短いチャンクを返す場合があります。fwriteの有効なチャンク長を計算する必要はありませんか?
セルゲイ

25

Varcの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が本当に役に立ったと感謝します
Rakesh Sharma

素晴らしい-それは非常に役立っています!Vartecsの回答にも注意する必要があります
Nick

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)

2
allow_url_fopen = Onが必要
zloctb '18

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スクリプトを配置する予定のパスにあるimagesという名前のフォルダーを作成します。すべての人に書き込み権限があることを確認してください。そうでない場合、スクリプトは機能しません(ファイルをディレクトリにアップロードできません)。


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から画像を生成します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.