• 締切済み

X-SERVERでのCSVダウンロードについて

閲覧ありがとうございます。 現在、X-SERVERの共有SSL環境下でCSVダウンロードをすることができず困っております。 ダウンロードダイアログは出るのですが、ダウンロードしたファイルサイズが0バイトになってしまっている状態です。 ちなみに通常のhttp環境下では正常にCSVダウンロードができているため、SSLもしくは共有SSLが原因だと思っております。 どなたか原因お分かりになる方いましたらご教授頂ければと思います。 ちなみにFF32.0.2で検証していて、CSVダウンロードのレスポンスヘッダーは以下になっております。 ---------- HTTP/1.1 200 OK Date: Mon, 22 Sep 2014 15:23:01 GMT Server: Apache Cache-Control: public Pragma: public Content-Disposition: attachment; filename="reservations_20140923002302.csv" Last-Modified: Mon, 22 Sep 2014 15:23:02 GMT Content-Length: 8132; Content-Type: application/octet-stream Set-Cookie: RESERVEADMIN=deleted; expires=Sun, 22-Sep-2013 15:23:00 GMT; path=/ Set-Cookie: RESERVEADMIN=4ivlg2psk6flprpfeiilb2i6raq5v17d; path=/; secure; HttpOnly Connection: close ----------

みんなの回答

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.1

>通常のhttp環境下では正常にCSVダウンロードができている これはX-SEVERのPHPから何らかの関数で外部サーバーにhttpsで接続すると データが受け取れないということですね? 当該のX-SEVER上のクライアントになるブラウザからならダウンロードできる のでしょうか? ファイアウォールかプロクシの問題のような気がしますが PHPの関数はなにを利用していますか?

mookun2007
質問者

お礼

自己解決しましたので一応ご報告させていただきます。 いろいろ試した結果、理由はわかりませんが、Content-Lengthヘッダーを出力しないようにしたら正常にダウンロードできるようになりました。 この度はご回答いただきありがとうございました。

mookun2007
質問者

補足

ご回答ありがとうございます。 http://abc.com/csv.phpがCSVダウンロードを行うURLだったとします。 これをX-SERVERの共有SSLを設定すると、URLは以下になります。 https://abc-com.ssl.xserver.jp/csv.php httpの方では正常にCSVダウンロードできるのですが、httpsの方だとダウンロードしたファイルサイズが0バイトになってしまいます。 httpsでCSVダウンロードする際、ダウンロードダイアログにはファイルサイズ8kbみたいな感じで空じゃないのが確認できているのですが、実際にダウンロードしたファイルは0バイト・・ ブラウザがキャッシュできてないのでしょうか? > PHPの関数はなにを利用していますか? CSVダウンロード自体は特に外部サーバに接続などはしておらず、DBから取得したデータをカンマ区切りの文字列に整形して標準出力しているだけです。 検索しても、 IE+SSL環境下だとCSVダウンロードがうまくいかないためキャッシュヘッダーを出力すればいい という記事はよく見かけますが、キャッシュヘッダーは既に出力してますし、X-SERVERに問合せしてもとんちんかんな回答が返ってきて途方に暮れております。 一応該当部分のソース記載してみます。 cakephpで実装していますので、Modelからのデータ取得部分などcakephp特有の記述が入っております。 ----- CSVダウンロードを行うアクションの該当部分 ----- $reservations = $this->Reservation->find( 'all', array( 'contain' => array('ReservationReason', 'Event', 'Area', 'Pref'), 'conditions' => $conditions, ) ); $result = ''; $csvData = array(); $csvData[] = implode(',', $this->convertCsv($csvHeader)); $filename = 'reservations_'. date('YmdHis') . '.csv'; foreach ($reservations as $v) { $reason = array(); foreach ((array)$v['ReservationReason'] as $vv) { $reason[] = $this->selectionConfig['reason'][$vv['reason_id']]; } $row = array( $v['Reservation']['id'], $v['Reservation']['email'], $this->selectionConfig['sex'][$v['Reservation']['sex']], $v['Reservation']['name_last'], $v['Reservation']['name_first'], $v['Reservation']['birthday'], $v['Reservation']['age'], $v['Area']['name'], $v['Pref']['name'], $v['Reservation']['tel'], implode("\n", $reason), $v['Reservation']['reason_other'], $this->selectionConfig['melmaga'][$v['Reservation']['melmaga']], preg_replace("/\r\n|\r/is", "\n", $v['Reservation']['comment']), $v['Reservation']['created'], $this->selectionConfig['is_status'][$v['Reservation']['is_status']], sprintf( '%s %s %s', date('n/j', strtotime($v['Event']['open_date'])), $v['Event']['open_time'], $v['Event']['meeting_place'] ), ); $csvData[] = implode(',', $this->convertCsv($row)); } $result = mb_convert_encoding(implode("\r\n", $csvData), 'sjis-win', mb_internal_encoding()); $this->cacheHeader(); $this->attachmentHeader( $filename, strlen($result) ); echo $result; exit; ----- /CSVダウンロードを行うアクションの該当部分 ----- protected function convertCsv($value) { if (is_array($value)) { $value = array_map(array($this, 'convertCsv'), $value); } else { $value = str_replace('"', '""', $value); $value = sprintf('"%s"', $value); } return $value; } protected function cacheHeader($cache_control = 'public') { header(sprintf('Cache-Control: %s', $cache_control)); // HTTP/1.1 header(sprintf('Pragma: %s', $cache_control)); // HTTP/1.0 header("Last-Modified: " . gmdate("D, d M Y H:i:s", time()) . " GMT"); } protected function attachmentHeader($filename, $filesize = 0) { header(sprintf('Content-disposition: attachment; filename="%s"', $filename)); header('Content-Type: application/octet-stream'); if (!empty($filesize)) { header(sprintf('Content-Length: %d;', $filesize)); } }

すると、全ての回答が全文表示されます。

関連するQ&A