質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

4回答

11730閲覧

PHP csvファイルのダウンロード時に中身が変わってしまう

SONIK

総合スコア14

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2016/07/08 05:24

編集2016/07/08 05:58

お世話になります。
PHP初心者のものです。

サーバ上にあるcsvファイルをダウンロードしようと
したところ、中身が

<HTML> <HEAD> <TITLE>.... の様に、自分で書いたHTML文の先頭の部分に変わってしまいます。

サーバ上にあるcsvデータの中身は正しいままです。

php

1// ファイルのパス 2$filepath = 'test.csv'; 3// リネーム後のファイル名 4$filename = 'テスト.csv'; 5 6header('Content-Disposition: attachment; filename="'.$filename.'"'); 7header('Content-Type: application/octet-stream'); 8header('Content-Transfer-Encoding: binary'); 9header('Content-Length: '.filesize($filepath)); 10 11readfile($filepath);

[追記]

以下の方法でやると、HTML文が全文出た後に出力予定のcsvファイルの中身が
出力されました。

php

1// ファイルのパス 2$filepath = 'test.csv'; 3// リネーム後のファイル名 4$filename = 'テスト.csv'; 5 6header('Content-Description: File Transfer'); 7header("Content-Disposition: attachment; filename=$filename"); 8header('Content-Type: application/force-download;'); 9 10readfile($filepath);

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

ベストアンサー

php

1readfile($filepath); 2exit; // <- これを追加するだけでは?

投稿2016/07/08 06:13

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

SONIK

2016/07/08 06:18

失礼致しました。 exit; は記載忘れです。 readfileの後に記述してあります。
退会済みユーザー

退会済みユーザー

2016/07/08 06:21 編集

それだとしたら、HTMLの中に、<?php ?>を埋め込みしてますね。 csv以外のものをechoしてはいけません。
SONIK

2016/07/08 06:46

ありがとうございます。 おっしゃる通り、<?php ?>埋め込みしておりました。 そしてヒアドキュメントでHTMLを出力していたため、 <HTML>...という内容がダウンロードされていたものと 考えられます。
guest

0

こちらの質問が参考になりそうです。
https://teratail.com/questions/39543

投稿2016/07/08 06:10

ttyp03

総合スコア16998

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

皆様、沢山のご回答を頂きありがとうございました。
以下の内容に変更することで、HTML文を除去することが出来ました。

php

1// ファイルのパス 2$filepath = 'test.csv'; 3// リネーム後のファイル名 4$filename = 'テスト.csv'; 5 6header('Content-Description: File Transfer'); 7header("Content-Disposition: attachment; filename=$filename"); 8header('Content-Type: application/force-download;'); 9 10ob_clean(); //追記 11flush(); //追記 12 13readfile($filepath); 14 15exit;

原因に関しては Kosuke_Shibuyaさんのご指摘内容が
最も近かったかと思いますので、ベストアンサーとさせて頂きます。

ご回答頂きました皆様、大変ありがとうございました。

投稿2016/07/08 06:51

SONIK

総合スコア14

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

リネーム後のファイル名は、日本語ファイル名ということでよろしいでしょうか?
その場合ユーザーエージェントをみて、IEならSJIS、その他ならUTF8にしておかないと
ファイル名が文字化けしそうですが大丈夫ですか?

またリネーム後のファイル名を別の英数文字に変えても同じ同じ現象でしょうか?

投稿2016/07/08 05:28

yambejp

総合スコア114829

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

SONIK

2016/07/08 05:34

回答ありがとうございます。 リネーム後のファイル名を"test.csv"に変更しても結果は変わりませんでした。
yambejp

2016/07/08 05:41

ちなみにそのhtmlなんたらの後ろにreadfileしたデータは出力されているのでしょうか? また出力されない場合はreadfile($filepath)をprint "test"のように書き換えて 出力されるか確認するとよいでしょう 何らかの理由でご利用のサーバーやサービスが自動でなにかヘッダを 吐き出す仕組みになっているのかもしれません
SONIK

2016/07/08 05:49

readfile($filepath)をprint "test"に変えて実行してみたところ、 text.csvというファイルが出力されました... 中身はもちろん<HTML>...といった内容でした。 ご指摘の通り、サーバの仕組みなのかもしれませんね...
SONIK

2016/07/08 05:50

[訂正] text.csv:誤 test.csv:正
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問