HTTP経由でリモートサーバーから画像をコピーする


82

PHPを使用してリモートサーバーからローカルフォルダーに画像をインポート/コピーする簡単な方法を探しています。サーバーへのFTPアクセスはありませんが、すべてのリモートイメージにHTTP経由でアクセスできます(つまり、http://www.mydomain.com/myimage.jpg)。

使用例:ユーザーが自分のプロファイルに画像を追加したいと考えています。画像はすでにウェブ上に存在し、ユーザーは直接URLを提供します。画像をホットリンクしたくはありませんが、ドメインからインポートして提供したいと思います。


サーバーにはこのためのプロキシモジュールがありませんか?
ジグガンジャー2017年

回答:


154

サーバーでPHP5とHTTPストリームラッパーを有効にしている場合、それをローカルファイルにコピーするのは非常に簡単です。

copy('http://somedomain.com/file.jpeg', '/tmp/file.jpeg');

これにより、必要なパイプラインなどが処理されます。いくつかのHTTPパラメーターを提供する必要がある場合は、提供できる3番目の「ストリームコンテキスト」パラメーターがあります。


33
php.iniではallow_url_fopenを=オンにする必要があることに注意してください。
mauro.dec 2009

3
allow_url_fopenコメントは、1時間の頭を悩ませるだけで解決しました。ありがとう、@ mauro.dec!
Michael Stalker 2012年

2
このようなURLで何を寄付していますhttp://desmond.imageshack.us/Himg100/scaled.php?server=100&filename=desertoh.jpg&res=crop か?
ユセフェリ2012

この答えをありがとう-私はほとんどそこにいると思います!'/tmp/file.jpg'と言うとき、それは何に関連していますか?Webサーバーのルート...(例:/ var / www / vhostsなど)またはWebサイトのルート:/ httpdocs / ... ?? ファイルが表示されるのを確認できません。url-fopenをONに設定しています。!!
厄介な2013年

1
httpsを使用せず、httpのみ
edCoder 2015年

31

使用する

$imageString = file_get_contents("http://example.com/image.jpg");
$save = file_put_contents('Image/saveto/image.jpg',$imageString);

ありがとう!!2番目の解決策は機能しています..すべての解決策のトップは私には機能しません:p
Rajnish 2013

4
小さいファイルの場合は良いヒントですが、大きいファイルの場合はphpメモリが爆発します:(
Radon8472 2014年

10

PHPには、ファイルの内容を文字列に読み込む組み込み関数file_get_contents()があります。

<?php
//Get the file
$content = file_get_contents("http://example.com/image.jpg");

//Store in the filesystem. $fp = fopen("/location/to/save/image.jpg", "w"); fwrite($fp, $content); fclose($fp); ?>

ファイルをデータベースに保存する場合は、$ content変数を使用するだけで、ファイルをディスクに保存しないでください。


2
一部のサーバー担当者はセキュリティ上の理由でfile_get_contentsをサポートしていないため、curlを使用するのは良い方法です
Rinto George

1
小さいファイルには良いヒントですが、大きいファイルにはphpメモリが爆発します:(標準のphpの一部ではないため、curlも適切な選択ではありません
Radon8472 2014年

8

あなたはこれらの4つの可能性について持っています:


なぜ「ソケットを直接使用しようとしないでください。」?(これは私が使用しているものです、gist.github.com / 0893a7ec908ff508aac6
Gajus 2012年

@Gajus:そのスニペットで直接ソケットを使用していません。あなたはリモートファイルを開くためにphpの機能を使用しています。
ゲオルクSchölly

4

最も基本的な方法は次のとおりです。

$url = "http://other-site/image.png";
$dir = "/my/local/dir/";

$rfile = fopen($url, "r");
$lfile = fopen($dir . basename($url), "w");

while(!feof($url)) fwrite($lfile, fread($rfile, 1), 1);

fclose($rfile);
fclose($lfile);

ただし、これを何度も実行している場合(またはホストがリモートシステムへのファイルアクセスをブロックしている場合)は、CURLの使用を検討してください。これは、より効率的で、やや高速で、より多くの共有ホストで利用できます。

また、ユーザーエージェントを偽装して、ボットではなくデスクトップのように見せることもできます。

$url = "http://other-site/image.png";
$dir = "/my/local/dir/";
$lfile = fopen($dir . basename($url), "w");

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)');
curl_setopt($ch, CURLOPT_FILE, $lfile);

fclose($lfile);
curl_close($ch);

どちらの場合も、GDを通過させて、実際に画像であることを確認することをお勧めします。


1
GDで画像を確認するには、ファイルを保存した直後にこれを実行することを検討してください:psoug.org/snippet/Check_if_an_image_exists_GD_364.htm-falseに戻った場合は、すぐにファイルを削除してください。
オリ

4
curl_exec($ch)curl_close($ch)に見逃したfclose($ch)ので、前curl_close($ch)ではなく最後に配置する必要があります。つまり、ファイルに何も書き込まれる前にファイルを閉じるため、空のファイルしか取得されません。
ヘンドラウジア2010

2

file_get_contentsを使用すると非常に簡単です。最初のパラメータとしてURLを指定するだけです。


1
これは、セキュリティ上の理由から、多くの共有ホスト上のローカルファイルシステムにロックダウンされています。cURLは、より優れ、より高速で、より強力などです。通常、リモートファイルシステムでfopenをブロックするホストで利用できます。
オリ

cURLが利用可能な場合、それはさらに良いでしょう。<a href=" se2.php.net/curl"> cUrl at php.net </a>を参照
PatrikAkerstrand 2009年

2

フォルダを作成し、敵の例に名前を付けます。開いているメモ帳をダウンロードして、このコードを挿入します

http://www.google.com/aa.zipをファイルに変更して、たとえばm.phpに保存するだけです。

phpファイルを666に、フォルダを777にダウンロードします。

<?php
define('BUFSIZ', 4095);
$url = 'http://www.google.com/aa.zip';
$rfile = fopen($url, 'r');
$lfile = fopen(basename($url), 'w');
while(!feof($rfile))
fwrite($lfile, fread($rfile, BUFSIZ), BUFSIZ);
fclose($rfile);
fclose($lfile);
?>

最後に、ブラウザからこれらのURLhttp ://www.example.com/download/m.phpに入力します

ダウンロードフォルダに他のサーバーからのファイルのダウンロードが表示されます

ありがとう


0

GETリクエストを使用して画像をダウンロードし、サーバー上のWebアクセス可能なディレクトリに保存します。

PHPを使用curlしているので、他のサーバーからファイルをダウンロードするために使用できます。


0

質問に「php」のタグを付けたので、サーバーで実行中のphpを想定します。最善の策は、独自のWebサーバーを制御してから、cURLをphpにコンパイルすることです。これにより、Webサーバーが他のWebサーバーにリクエストを送信できるようになります。これはセキュリティの観点から非常に危険である可能性があるため、ほとんどの基本的なWebホスティングプロバイダーはこのオプションを有効にしません。

これがcURLの使用に関するphpのmanページです。コメントでは、ダウンロードして画像ファイルを作成する例を見つけることができます。

libcurlを使用したくない場合は、fsockopenを使用して何かをコーディングできます。これはphpに組み込まれており(ただし、ホストで無効になっている場合があります)、ソケットに対して直接読み取りおよび書き込みを行うことができます。fsockopenのmanページの例を参照してください


0

元のファイル名と拡張子を保持する必要がある人のために

$origin = 'http://example.com/image.jpg';

$filename = pathinfo($origin, PATHINFO_FILENAME);
$ext = pathinfo($origin, PATHINFO_EXTENSION);

$dest = 'myfolder/' . $filename . '.' . $ext;

copy($origin, $dest);

-5

この回答は、サーバーからクライアント側にイメージをダウンロードするのに役立ちました。

<a download="original_file.jpg" href="file/path.jpg">
  <img src="file/path.jpg" class="img-responsive" width="600" />
</a>
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.