- 締切済み
csvダウンロードについて
はじめまして。cakephpで制作しております。 csvファイルをダウンロードしようとしており、以下のようなコードを使用しておりますが、期待するデータが上手くダウンロードできません。 ファイルのパスは/file/list/csv/hoge/hoge.csv です。 $result = $this->_createCSV($mode, $auction_title, $data); $file_url = "/" . $result; $file = basename($file_url); //$this->set("loading", 1); //$this->set("file_path", $result); header('Content-Type: application/x-csv'); header('Content-Disposition: attachment; filename="'. $file .'"'); header('Content-Transfer-Encoding: binary'); header('Content-Length: '.filesize($file)); readfile($file_url); 生成したcsvファイルを直接見てみると正常に値が入っているのですが、ダウンロードすると pre class="cake-debug"> <a href='javascript:void(0);' onclick='document.getElementById("CakeStackTrace1").style.display = (document.getElementById("CakeStackTrace1").style.display == "none" ? "" : "none")'><b>Warning</b> (512)</a>: <span style = "color:Red;text-align:left"><b>SQL Error:</b> 1054: Unknown column 'EntryMember.user_id' in 'field list'</span> [<b>CORE\cake\libs\model\datasources\dbo_source.php</b>, line <b>525</b>] </pre> <div id="CakeStackTrace1" class="cake-stack-trace" style="display: none;"><a href='javascript:void(0);' onclick='document.getElementById("CakeErrorCode1").style.display = (document.getElementById("CakeErrorCode1").style.display == "none" ? "" : "none")'>Code</a> | <a href='javascript:void(0);' onclick='document.getElementById("CakeErrorContext1").style.display = (document.getElementById("CakeErrorContext1").style.display == "none" ? "" : "none")'>Context</a><pre id="CakeErrorContext1" class="cake-context" style="display: none;">$sql = "SELECT `EntryMember`.`id`, `EntryMember`.`mail`, `EntryMember`.`temp_url`, `EntryMember`.`created`, `EntryMember`.`modified`, `EntryMember`.`user_id` FROM `entry_members` AS `EntryMember` WHERE `EntryMember`.`user_id` = (76) " $error = "1054: Unknown column 'EntryMember.user_id' in 'field list'" $out = null</pre><div id="CakeErrorCode1" class="cake-code-dump" style="display: none;"><pre><code><span style="color: #000000"> $out = null;</span></code> <code><span style="color: #000000"> if ($error) {</span></code> <span class="・・・・・ のようなコードがぎっしり書き込まれた状態になります。 ファイルパスの問題か文字コードの問題だと思うのですが、どのように対処してよいか万策つきております。 どなたかご教示いただけますよう宜しくお願い致します。
- みんなの回答 (4)
- 専門家の回答
みんなの回答
- karumakaruma
- ベストアンサー率65% (65/100)
#3です。 根本的な所なのですが、通常CSVをダウンロードする際 ヘッダを設定し、readfile($file_url);などでファイルの中身を 標準出力すれば、そのファイルの中身がダウンロードファイルに 書かれています。 今回、サーバー上のファイルとダウンロードしたファイルが 違うという事なので、別物なのではないかと考えています。 ヘッダー部を全てコメントし、画面上にファイルの中身を 表示すればどうなりますか? //header(... ついでに print $file_url . "<br>\n"; とか入れて、変数の中身の確認もした方がいいかもしれません。 あとついでに >ダウンロードするのにファイルの文字コードとか関係あるのでしょうか。 >因みに、使用している文字コードはUTF-8でCSVファイルに書き込む時もUTF-8です。 CSVファイルをWindows上でExcel等で読まれる場合はSJISに変換して書き込んでください。 ExcelがUTF-8を認識しないので・・・
- karumakaruma
- ベストアンサー率65% (65/100)
生成したcsvファイルとダウンロードするファイルは 本当に一緒でしょうか? ダウンロードしたファイルの中に SQL Error:1054: Unknown column 'EntryMember.user_id' in 'field list' CORE\cake\libs\model\datasources\dbo_source.php, line 525 という記述があるので、生成時のデータ取得時にエラーになっているはずです。 一旦/file/list/csv/hoge/hoge.csvを削除し もう一度生成して/file/list/csv/hoge/hoge.csvが存在するか ご確認ください。 また、field list?にEntryMember.user_idが含まれていないようですので 追加するか取得内容から外すかして生成できるかの確認も した方がいいかもしれません。
- UmJammer
- ベストアンサー率58% (115/196)
cakePHPがデバッグ情報を出力しているようなので、これをオフにすればよいのでは。設定できるはずです。 これだけではダメだった気がするのですが思い出せません。 参考までに。
お礼
ご回答していただきありがとうございます。 debugを0にしてダウンロードしてみたところ、htmlソースが書き込まれた状態です。期待する値は含まれていませんでした。 ちなみに、ダウンロードボタンを押した時にデータをDBから読み込んでcsvを生成してダウンロード処理をしています。 生成したファイルを直接開いてみると期待する値ではありますが、文字化けしている状態なんです。 そのファイルをダウンロードしたところ上記のソースが書き込まれています。
- yambejp
- ベストアンサー率51% (3827/7415)
まずは・・・ file_exists($file_url) するところから
お礼
回答していただきありがとうございます。 file_exists($file_url)をしてみたところ、falseが返ってました。 $_SERVER['DOCUMENT_ROOT'] . "/file/list/csv/hoge/hoge.csv"で 返り値をtrueにしてダウンロードしてみたんですが、ファイルの内容は ブラウザで表示されている内容が全て書き込まれている状態です。 ダウンロードするのにファイルの文字コードとか関係あるのでしょうか。 因みに、使用している文字コードはUTF-8でCSVファイルに書き込む時もUTF-8です。
お礼
回答していただきありがとうございます。 SQL Error:1054: Unknown column 'EntryMember.user_id' in 'field list'については今回csvファイルを生成する際にデータは使用していません。 ただ、モデルで$hasManyをしているためEntryMemberのフィールドが無いから出ているのだと思っていますが、とりあえず使っていないので無視してました。これが影響しているのでしょうか。