7

リモート ファイルをダウンロードして、元のファイルと同じ名前でサーバー ディレクトリに配置したいと考えています。使ってみましたfile_get_contents($url)

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

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

4

3 に答える 3

7

別の方法で解決しました。URL ヘッダーにcontent-dispositionがない場合、ファイル名が URL に存在することがわかりました。したがって、このコードはあらゆる種類の 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);

} 

できます!:)

于 2012-08-09T22:19:18.417 に答える
5

Peter222のコードに基づいて、ファイル名を取得する関数を作成しました。$http_response_header変数を使用できます。

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はfile_get_contents()で埋められます)

$url = 'http://example.com/test.zip';
$myfile = file_get_contents($url);
$filename = get_real_filename($http_response_header,$url)
于 2012-12-09T21:55:29.117 に答える
0

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

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

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

cURL別の解決策として、ライブラリ (サーバー (クライアント) から URL を使用して他のサーバーへのクエリを処理するために使用されるため、cient URLという名前) またはファイル ソケットの使用のみを提案できます。を使用してファイル名を取得する方法を説明するStack Overflow に関する別の質問の回答を次に示しますcURL

また、 の管理者/保守担当者/ウェブマスター チームに連絡して、domain.comファイル名やその他のメタデータを取得するための API が公開されているかどうかを尋ねてみてください。

于 2012-08-07T09:21:56.283 に答える