web-dev-qa-db-ja.com

HTTP経由でリモートサーバーからイメージをコピーする

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

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

79
GiladG

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

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

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

148
Ciaran McNulty

つかいます

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

次の4つの可能性があります。

  • リモートファイル 。これにはallow_url_fopenをphp.iniで有効にしますが、これが最も簡単な方法です。

  • または、PHPインストールでサポートされている場合は cURL を使用できます。 もあります。

  • そして、本当に手動でやりたい場合は、 HTTPモジュール を使用します。

  • ソケットを直接使用する でさえ試みないでください。

7
Georg Schölly

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

$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に渡すことができます。

4
Oli

フォルダーを作成し、そのファイルに名前を付ける

http://www.google.com/aa.Zip のみをファイルに変更し、たとえばm.phpに保存します。

pHPファイルを666に、フォルダダウンロードを777にchamod

<?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);
?>

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

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

ありがとう

2

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

2

プロキシの背後にあるコピー機能を使用してリモートファイルをコピー/ダウンロードしようとしましたが、コピーはプロキシなしで直接接続します。

設定をデフォルトのコンテキストとして設定し、コピーする関数パラメーターとして設定しようとしました。

ただし、コンテキストは使用されないように見えますが、readfileまたはget_headers同じコンテキストを正常に使用します。

ここに私のコードがあります:

$url = "http://myserver.com/testfile";
$context_opts = array(
     "http" => array(
       "proxy" => "tcp://myProxy:8080",
       "request_fulluri" => True,
       "ignore_errors"   => true
     )
  );

stream_context_get_default($context_opts); 
print_r(get_headers($url,1));

copy($url,$filename, stream_context_create($context_opts));

私のサーバーは以下で実行されています:

  • Windows XP SP3
  • Apache 2.2.12(サービスとして実行)
  • PHP 5.3.0(API20090626、TS、VC6)(Apacheモジュールとして設定)

urlfopenが有効になっているhttpおよびhttpsストリームがphpに登録されています

1
Radon8472

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

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

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

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

copy($Origin, $dest);
0

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

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

0
Peter Stuifzand

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

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

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

0
brianegge