PHPで質問があります。PHPは5.2.10です。

以下の【A】【B】どちらの処理でも、Content-Lengthを指定しているにもかかわらず、
a.csvには「a,b,cダウンロードが終わりました」というa.csvファイルがダウンロードされます。
期待値は、もちろん「a,b,c」という内容のa.csvがダウンロードされることです。
どこかおかしいのかわからないので、質問させていただきました。よろしくお願いいたします。

【A】
$message = 'a,b,c';
$len = strLen($message);
header('Content-type: text/plain');
header('Content-Disposition: attachment; filename="a.csv"');
header('Content-Length: ' . strLen($message));
echo $message;
echo 'ダウンロードが終わりました';

【B】
file_put_contents($file, 'a,b,c');
header('Content-type: text/plain');
header('Content-Disposition: attachment; filename="a.csv"');
header('Content-Length: ' . fileSize($file));
readFile($file);
echo 'ダウンロードが終わりました';

回答の条件
  • URL必須
  • 1人3回まで
  • 登録:
  • 終了:2010/06/27 22:15:04
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:hanako393 No.2

回答回数1142ベストアンサー獲得回数87

ポイント35pt

echo 'ダウンロードが終わりました';

こんなのつけたら、駄目です。

Content-Lengthなんてちゃんとまともに読んでるブラウザなんて

ないです。

http://q.hatena.ne.jp/answer

id:cochoo

ご回答頂きありがとうございます。

> Content-Lengthなんてちゃんとまともに読んでるブラウザなんてないです。

やはりそうですか。

コメントは、No.1さんと同じです。

みなさん、どのようなプログラムをしているんでしょうか?

こちらで、ちょっと調べてみることにします。ありがとうございました。

2010/06/27 21:32:22

その他の回答1件)

id:yamaneroom No.1

回答回数1040ベストアンサー獲得回数61

ポイント35pt

この行が悪い。消去すべし。

echo 'ダウンロードが終わりました';

http://q.hatena.ne.jp/

id:cochoo

ありがとうございます。

ちょっと話が横道にそれるかもしれませんが、実際のプログラムは、

echo $message;とecho 'ダウンロードが終わりました';の間に結構いろいろ処理が入っています。

にもかかわらず、随分後のechoも拾ってしまうということがおかしいなと思った次第です。

結局、headerでダウンロードを行う場合、ダウンロードする文末の判断は、PHPの終了、つまり、

?>で終わらせないといけないような気がします。たとえば、

<中略>

echo $message;

?>

とすべきと勝手に思いました。

PHPがこのような作りだと、ちょっと陳腐な仕様だと思います。

2010/06/27 21:31:10
id:hanako393 No.2

回答回数1142ベストアンサー獲得回数87ここでベストアンサー

ポイント35pt

echo 'ダウンロードが終わりました';

こんなのつけたら、駄目です。

Content-Lengthなんてちゃんとまともに読んでるブラウザなんて

ないです。

http://q.hatena.ne.jp/answer

id:cochoo

ご回答頂きありがとうございます。

> Content-Lengthなんてちゃんとまともに読んでるブラウザなんてないです。

やはりそうですか。

コメントは、No.1さんと同じです。

みなさん、どのようなプログラムをしているんでしょうか?

こちらで、ちょっと調べてみることにします。ありがとうございました。

2010/06/27 21:32:22
  • id:doropon
    おっしゃいたいことはわからないでもないのですが、
    echo 'ダウンロードが終わりました';
    を抜けば動くというところで、

    そういうもんです。くらいしかお答えできないなと。
    apacheが出してくるContent-Lengthはスクリプトの中の長さより、
    ダウンロードが終わりました
    分だけ長いですね。

    んー、スクリプトはダウンロードを目的としているならば、
    終わりましたのメッセージはいらないと思いますし、
    もし、ブラウザ上で終わりましたのメッセージをちゃんと出したくて、
    書かれているのであれば構成がうまくないです。。
  • id:cochoo
    あ、コメントありがとうございました。
    実際のプログラムは、以下のようなものです。

    <中略>
    echo $message;
    <DB処理:中略>
    echo '<A HREF="xxx.php">戻る</A>';

    No.1さんへのコメントのように、随分後の処理でechoまでも拾ってしまうのが気になりました。
    上記処理は、ある処理からPOSTで呼び出され、ダウンロードを行った後に元の処理に戻るというものです。

    ダウンロードは、ダウンロードだけのModuleとすべきが最善の策と思いますが、
    自由度がない仕様のように思っています。
    いろいろ勉強になります。ありがとうございました^^
  • id:cochoo
    みなさま

    とにかく、私のダウンロードに対する考え方が誤っていたようです。
    通常、ダウンロードを行うあとにechoをつけるのは、みなさんが仰るとおり誤りだと認識しております。

    ダウンロードする処理は、ModuleやObjectでコンポネント化して外部から使うようにすることで
    解決しております。

    みなさんからのご意見を伺えて、確信がもてました。
    ありがとうございました。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません