2016-12-30 22 views
0

私はPHPを学んでいるので、これは教育目的の問題です。私が使っているチュートリアルでは答えが見つからないので、私には分かりやすくするためにあなたからうまくいくでしょう。だから、PHPのreadfile()戻り値を処理する方法

、我々はファイル "TEXT.TXT" を持っている想像と内容は次のとおりです。

"Hello World!" 

次のPHPスクリプト:

<?php 

echo readfile("text.txt"); 

?> 

ウィル出力 "!Hello Worldの12" - 私はすることができますそのような出力が役に立つことがある場合は考えてください。最後にファイルの長さを見たくない場合は、「エコー」を省略しなければならないことがわかりました:

<?php 

readfile("text.txt"); 

?> 

出力は "Hello World!"になります。これは良い方法ですが、手動で言う: "ファイルから読み取られたバイト数を返します。"、私の質問は - どのようにreadfile()関数を使用してファイルの長さを取得するはずですか?私の論理によれば、ファイルの内容は "返され"ますが、何か正しいものを得られなかったような気がします。これを理解するのを手伝ってください。

+0

あなたは 'filesize(" text.txt ");'を使用できません。 – Farkie

+0

@Farkieご意見ありがとうございます。さて、私はできる、それは動作します。しかし、私が言ったように、私はPHPを学びたいと思っているので、私は物事の仕組みを理解することができて喜んで、マニュアルはreadfile()がバイト数を返すので、私はそれを使い方を理解しようとしています右。 – Mike

+0

@Mike filesize($ file)は、ファイルのサイズをバイト数(int)で返します。次の点を確認してください:http://php.net/manual/en/function.filesize.php – fugitive

答えて

1

readfile()を使用してファイルのサイズを確認しますか?もちろん、この関数もファイルを出力します。大したことではなく、この状況で使用できるものがあります:output buffering

<?php 

ob_start(); 
$length = readfile("text.txt"); 
// the content of the file isn't lost as well, and you can manipulate it 
$content = ob_get_clean(); 

echo $length; 

?> 
+0

私は知っていますが、なぜ "content + filesize"という時間に2つの値を返す関数が必要なのでしょうか?はい、私は人々が "内容を出力して値を返します"と言っていますが、出力を妨げずに戻り値を取得する方法はありません。 – Mike

+1

さて、さまざまなことをするにはさまざまな方法があります。このメソッドは実際に大きなファイルをメモリに保持しないので出力するのに適しています。私はそれが未知の_reasons_の長さを返すと思います! – Farkie

1

readfileは、ファイルサイズやファイルの内容を書き込むのには使用されません。通常、ファイルをクライアントに送信するために使用されます。たとえば、クライアントがフォームを送信した後、またはリンクをクリックした後で、WebアプリケーションでPDFファイルを作成したとします。場合によってはファイルに直接指示することもできますが、何らかの理由(セキュリティなど)で必要としないことがあります。このようにすれば、これを行うことができます:

どのように使用することができますか。

$filepath = "../files/test.pdf"; 

    header("Content-Description: File Transfer"); 
    header("Content-Type: application/pdf; charset=UTF-8"); 
    header("Content-Disposition: inline; filename='test.pdf'"); 
    header("Content-Transfer-Encoding: binary"); 
    header("Content-Length: " . filesize($filepath)); 
    readfile($filepath); 
    exit; 

あなたが使用できる例。

$filepath = "../files/test.pdf"; 

    ob_start(); 
    $filesize = readfile($filepath); 
    $content = ob_get_clean(); 

    header("Content-Description: File Transfer"); 
    header("Content-Type: application/pdf; charset=UTF-8"); 
    header("Content-Disposition: inline; filename='test.pdf'"); 
    header("Content-Transfer-Encoding: binary"); 
    header("Content-Length: " . $filesize); 

    echo $content; 

    exit; 

ここでは、正しいヘッダーに加えてファイルの内容を出力するので、ブラウザはそれをpdfファイルとして識別して開きます。

+0

あなたの答えをありがとうが、readfile()関数の "戻り値"がなぜ必要なのか、そしてどうすればそれを使うことができるのか説明できますか? – Mike

+1

'readfile'sが返す値からファイルサイズを使用し、' filesize'を呼び出すことを避けることができます。コンテンツをバッファリングするだけです。 –

+0

@MujnoiGyulaTamasが述べたように、あなたは私が投稿に書いたように別のファイルサイズを呼び出さないようにこれを使うことができます。ファイルサイズの代わりにreadfileの戻り値を使うことができるので、実際には高価ではないがもう1つの呼び出しを取り除くことができます。 – abeyaz

関連する問題