2012-08-07 14 views
5

リモートファイルをダウンロードして、元のファイルと同じ名前のサーバーディレクトリに保存します。私はfile_get_contents($url)を使ってみました。リモートファイル名をfile_get_contents()に取得してからファイルを保存できません。

ファイル名が$urlに含まれていないという問題は、それはwww.domain.com?download=1726のようです。このURLは、たとえばmyfile.exeですので、file_put_contents('mydir/myfile.exe');を使用します。

ファイル名はどのように取得できますか?私はダウンロードする前にget_headers()を試しましたが、私はファイルサイズ、変更日などの情報しか持っていないので、ファイル名がありません。

+0

が、それはあなたがHTTPを必要とするものをカバーしなければならないのcURLを見てください($ http_response_headerは(のfile_get_contentsで満たされる))://

function get_real_filename($headers,$url) { foreach($headers as $header) { if (strpos(strtolower($header),'content-disposition') !== false) { $tmp_name = explode('=', $header); if ($tmp_name[1]) return trim($tmp_name[1],'";\''); } } $stripped_url = preg_replace('/\\?.*/', '', $url); return basename($stripped_url); } 

使用法: あなたは$ http_response_header変数を使用することができますphp.net/manual/en/book.curl.php – Waygood

+0

cURLファイル名についてはこの質問をご覧くださいhttp://stackoverflow.com/questions/1750055/with-php-curl-get-filename-from-file-header – Waygood

答えて

0

file_get_contents() HTTPラッパーでは、ファイルがWebサーバーによって事前に解析されている場合、ファイルを直接ダウンロードしません。

は、次の例を見てみましょう:あなたは削除ウェブページ(example.com/foobar.php)にfile_get_contents()を呼び出す場合、あなたはfoobar.phpソースコードが提示されることはありませんが、example.comのウェブサーバはPHPファイルを解析する方法。したがって、生成されたHTML出力のみを取得することができます。

URLにファイル名が存在せず、どこからでもファイルを取得できる方法がない場合は、デッドエンドになります。データは、を呼び出すことはできません超越フィールドから。

代替ソリューションについては

、私は(したがって、その名前、URLを使用して他のサーバーにそれがクライアントだったとして、(サーバーからのクエリを処理するために使用される)効率の良いURLを)cURLライブラリを使用して提案することができますかfile sockets 。ここには、cURLを使用してファイル名を取得する方法を説明しているanother question's answer on Stack Overflowがあります。

さらに、管理者/管理者/ウェブマスターチームdomain.comに連絡して、ファイル名やその他のメタデータを取得するための公開されているAPIがあるかどうかを確認することもできます。

+0

ありがとうあなたはすばやい返信をします。私はcURLを試みます。しかし、私はまだブラウザは正確にファイル名を知っているのだろうか?このURLをブラウザに置くと、実際のファイル名でプロンプトウィンドウが表示されます。 Gecko/2009121601 Ubuntu/9.04(jaunty)Firefox/3.0。前に使用したとき、 ini_set( 'user_agent'、 'Mozilla/5.0(X11; U; Linux i686; en-US; rv:1.9.0.16)16 '); 私はブラウザのようだと思った: – Peter222

+0

[RFC 2183](http://www.ietf.org/rfc/rfc2183.txt)は 'Content-Disposition:'ヘッダを記述し、 'filename'ディレクティブです。ブラウザはヘッダーのこの部分を解析し、さまざまなメタデータをそこから取得します。私の答えに関連してリンクされている答えをチェックし、PHP(およびcURL)を使用してこのヘッダーを取得する方法を説明します。 – Whisperity

+0

上記のすべての例をテストしました。失敗。私は完全なこのサンプルクラスを試しました:http://stackoverflow.com/questions/6177661/how-do-download-a-file-with-curlしかし、元のファイル名をcURLで得ることはできません。たとえファイル名がURLに含まれていても。誰かが公開ファイル(jpgなど)に基づいて作業例を掲載することができますか?リモートからダウンロードして、同じ名前でローカルに保存するだけです。私は非常に感謝します。グーグルで2日間、アイデアはありません:( – Peter222

7

別の方法で解決しました。 URLヘッダーにのコンテンツ処理が存在しない場合は、URLにfilenameが存在することがわかりました。したがって、このコードはあらゆる種類のURL(cURLは不要)で動作します:

$url = "http://www.example.com/download.php?id=123"; 
// $url = "http://www.example.com/myfile.exe?par1=xxx"; 
$content = get_headers($url,1); 
$content = array_change_key_case($content, CASE_LOWER); 

    // by header 
if ($content['content-disposition']) { 
    $tmp_name = explode('=', $content['content-disposition']); 
    if ($tmp_name[1]) $realfilename = trim($tmp_name[1],'";\''); 
} else 

// by URL Basename 
{ 
    $stripped_url = preg_replace('/\\?.*/', '', $url); 
    $realfilename = basename($stripped_url); 

} 

これは機能します。 :)

+0

+1。非常に便利ですが、答えとして受け入れるのはなぜですか? このコードに問題はありますか? – aliqandil

5

Peter222のコードに基づいて、私はファイル名を取得する関数を書いた。

$url = 'http://example.com/test.zip'; 
$myfile = file_get_contents($url); 
$filename = get_real_filename($http_response_header,$url) 
関連する問題