PHPを使用して、リモートサーバーからローカルフォルダーに画像をインポート/コピーする簡単な方法を探しています。サーバーへのFTPアクセスはありませんが、すべてのリモートイメージにはHTTP経由でアクセスできます(つまり http://www.mydomain.com/myimage.jpg )。
使用例:ユーザーがプロファイルに画像を追加したいと考えています。画像はすでにWeb上に存在し、ユーザーは直接URLを提供します。画像をホットリンクするのではなく、自分のドメインからインポートして提供したいです。
サーバーでPHP5とHTTPストリームラッパーを有効にしている場合、ローカルファイルにコピーするのは非常に簡単です。
copy('http://somedomain.com/file.jpeg', '/tmp/file.jpeg');
これにより、必要なパイプライン処理などが処理されます。 HTTPパラメーターを提供する必要がある場合は、3つ目の「ストリームコンテキスト」パラメーターを提供できます。
つかいます
$imageString = file_get_contents("http://example.com/image.jpg");
$save = file_put_contents('Image/saveto/image.jpg',$imageString);
次の4つの可能性があります。
リモートファイル 。これにはallow_url_fopen
をphp.iniで有効にしますが、これが最も簡単な方法です。
そして、本当に手動でやりたい場合は、 HTTPモジュール を使用します。
ソケットを直接使用する でさえ試みないでください。
最も基本的な方法は次のとおりです。
$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に渡すことができます。
フォルダーを作成し、そのファイルに名前を付ける
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
他のサーバーからダウンロードしたファイルがダウンロードフォルダーに表示されます
ありがとう
file_get_contents を使用すると非常に簡単です。最初のパラメーターとしてURLを指定するだけです。
プロキシの背後にあるコピー機能を使用してリモートファイルをコピー/ダウンロードしようとしましたが、コピーはプロキシなしで直接接続します。
設定をデフォルトのコンテキストとして設定し、コピーする関数パラメーターとして設定しようとしました。
ただし、コンテキストは使用されないように見えますが、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));
私のサーバーは以下で実行されています:
urlfopenが有効になっているhttpおよびhttpsストリームがphpに登録されています
元のファイル名と拡張子を保持する必要がある人向け
$Origin = 'http://example.com/image.jpg';
$filename = pathinfo($Origin, PATHINFO_FILENAME);
$ext = pathinfo($Origin, PATHINFO_EXTENSION);
$dest = 'myfolder/' . $filename . '.' . $ext;
copy($Origin, $dest);
GETリクエストを使用して画像をダウンロードし、サーバー上のWebアクセス可能なディレクトリに保存します。
PHPを使用している場合、curl
を使用して他のサーバーからファイルをダウンロードできます。
質問に「php」というタグを付けたので、サーバーで実行中のphpを想定します。最善の策は、独自のWebサーバーを制御してから、cURLをphpにコンパイルすることです。これにより、Webサーバーが他のWebサーバーに要求を行うことができます。これはセキュリティの観点から非常に危険な場合があるため、ほとんどの基本的なWebホスティングプロバイダーはこのオプションを有効にしません。
cURLの使用に関するphpのマニュアルページ です。コメントには、ダウンロードと画像ファイルの例を見つけることができます。
Libcurlを使用したくない場合は、fsockopenを使用して何かをコーディングできます。これはphpに組み込まれていますが(ホスト上では無効になっている場合があります)、ソケットを直接読み書きできます。 fsockopen manページの例 を参照してください。