アプリ版:「スタンプのみでお礼する」機能のリリースについて

閲覧ありがとうございます。
現在、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
----------

A 回答 (1件)

>通常のhttp環境下では正常にCSVダウンロードができている



これはX-SEVERのPHPから何らかの関数で外部サーバーにhttpsで接続すると
データが受け取れないということですね?
当該のX-SEVER上のクライアントになるブラウザからならダウンロードできる
のでしょうか?

ファイアウォールかプロクシの問題のような気がしますが
PHPの関数はなにを利用していますか?

この回答への補足

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

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));
}
}

補足日時:2014/09/24 19:07
    • good
    • 0
この回答へのお礼

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

お礼日時:2014/09/25 12:32

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!