Index: /branches/version-2_13-dev/data/class/SC_Response.php
===================================================================
--- /branches/version-2_13-dev/data/class/SC_Response.php	(revision 23124)
+++ /branches/version-2_13-dev/data/class/SC_Response.php	(revision 23388)
@@ -336,3 +336,15 @@
         }
     }
+
+    /**
+     * ダウンロード用の HTTP ヘッダを出力する
+     *
+     * @return void
+     */
+    public static function headerForDownload($file_name) {
+        header("Content-disposition: attachment; filename={$file_name}");
+        header("Content-type: application/octet-stream; name={$file_name}");
+        header('Cache-Control: ');
+        header('Pragma: ');
+    }
 }
Index: /branches/version-2_13-dev/data/class/helper/SC_Helper_CSV.php
===================================================================
--- /branches/version-2_13-dev/data/class/helper/SC_Helper_CSV.php	(revision 23375)
+++ /branches/version-2_13-dev/data/class/helper/SC_Helper_CSV.php	(revision 23388)
@@ -173,5 +173,5 @@
             if ($val['status'] != CSV_COLUMN_STATUS_FLG_ENABLE
                 && $val['rw_flg'] == CSV_COLUMN_RW_FLG_KEY_FIELD
-) {
+            ) {
                 //キーフィールド
                 $result = false;
@@ -213,14 +213,8 @@
         // 1行目のみヘッダーを出力する
         if ($this->output_header) {
-            $line = $this->sfArrayToCsv(array_keys($data));
-            $line = mb_convert_encoding($line, 'SJIS-Win');
-            $line .= "\r\n";
-            fwrite($this->fpOutput, $line);
+            fputcsv($this->fpOutput, array_keys($data));
             $this->output_header = false;
         }
-        $line = $this->sfArrayToCsv($data);
-        $line = mb_convert_encoding($line, 'SJIS-Win');
-        $line .= "\r\n";
-        fwrite($this->fpOutput, $line);
+        fputcsv($this->fpOutput, $data);
         SC_Utils_Ex::extendTimeOut();
 
@@ -242,18 +236,14 @@
         $objQuery =& SC_Query_Ex::getSingletonInstance();
 
-        // テンポラリファイル作成
-        // TODO: パフォーマンス向上には、ストリームを使うようにすると良い
-        //  環境要件がPHPバージョン5.1以上になったら使うように変えても良いかと
-        //  fopen('php://temp/maxmemory:'. (5*1024*1024), 'r+');
-        $tmp_filename = tempnam(CSV_TEMP_REALDIR, $file_head . '_csv');
-        $this->fpOutput = fopen($tmp_filename, 'w+');
+        if (!$is_download) {
+            ob_start();
+        }
+
+        $this->fpOutput =& SC_Helper_CSV_Ex::fopen_for_output_csv();
+
+        // ヘッダー構築
         $this->output_header = false;
-
-        // ヘッダー構築
         if (is_array($arrHeader)) {
-            $header = $this->sfArrayToCsv($arrHeader);
-            $header = mb_convert_encoding($header, 'SJIS-Win');
-            $header .= "\r\n";
-            fwrite($this->fpOutput, $header);
+            fputcsv($this->fpOutput, $arrHeader);
         } elseif (is_null($arrHeader)) {
             // ループバック内でヘッダーを出力する
@@ -272,30 +262,26 @@
         fclose($this->fpOutput);
 
+        // CSV 用の HTTP ヘッダーを送出する。
         if ($is_download) {
-            // CSVを送信する。
-            $this->lfDownloadCSVFile($tmp_filename, $file_head . '_');
-            $res = true;
-        } else {
-            $res = SC_Helper_FileManager_Ex::sfReadFile($tmp_filename);
-        }
-
-        // テンポラリファイル削除
-        unlink($tmp_filename);
-
-        return $res;
-    }
-
-    /**
-     * 1次元配列を1行のCSVとして返す
-     * 参考: http://jp.php.net/fputcsv
-     *
-     * @param  array  $fields         データ1次元配列
-     * @param  string $delimiter
-     * @param  string $enclosure
-     * @param  string $arrayDelimiter
-     * @return string 結果行
+            $file_name = $file_head . '_' . date('ymd_His') .'.csv';
+            SC_Response_Ex::headerForDownload($file_name);
+            $return = true;
+        }
+        // 戻り値にCSVデータをセットする
+        else {
+            $return = ob_get_clean();
+        }
+
+        return $return;
+    }
+
+    /**
+     * 前方互換用
+     *
+     * @deprecated 2.13.2 fputcsv を使うこと。(sfDownloadCsvFromSql や cbOutputCSV の実装を参照)
      */
     public function sfArrayToCsv($fields, $delimiter = ',', $enclosure = '"', $arrayDelimiter = '|')
     {
+        trigger_error('前方互換用メソッドが使用されました。', E_USER_WARNING);
         if (strlen($delimiter) != 1) {
             trigger_error('delimiter must be a single character', E_USER_WARNING);
@@ -330,12 +316,11 @@
 
     /**
-     * 配列データのCSVを送信する。
-     *
-     * @param  array  $fields データ配列
-     * @param  string $prefix
-     * @return void
+     * 前方互換用
+     *
+     * @deprecated 2.13.2
      */
     public function lfDownloadCsv($arrData, $prefix = '')
     {
+        trigger_error('前方互換用メソッドが使用されました。', E_USER_WARNING);
         if ($prefix == '') {
             $dir_name = SC_Utils_Ex::sfUpDirName();
@@ -344,35 +329,24 @@
             $file_name = $prefix . date('ymdHis') .'.csv';
         }
-
-        /* HTTPヘッダの出力 */
-        Header("Content-disposition: attachment; filename=${file_name}");
-        Header("Content-type: application/octet-stream; name=${file_name}");
-        Header('Cache-Control: ');
-        Header('Pragma: ');
+        SC_Response_Ex::headerForDownload($file_name);
 
         /* データを出力 */
+        $fp =& SC_Helper_CSV_Ex::fopen_for_output_csv();
         foreach ($arrData as $lineArray) {
-            $lineString = $this->sfArrayToCsv($lineArray);
-            $lineString = mb_convert_encoding($lineString, 'SJIS-Win');
-            echo $lineString . "\r\n";
-        }
-    }
-
-    /**
-     * CSVファイルを送信する。
-     *
-     * @param  string $filepath 送信するファイルのフルパス
-     * @param  string $prefix
-     * @return void
+            fputcsv($fp, $lineArray);
+        }
+        fclose($fp);
+    }
+
+    /**
+     * 前方互換用
+     *
+     * @deprecated 2.13.2
      */
     public function lfDownloadCSVFile($filepath, $prefix = '')
     {
+        trigger_error('前方互換用メソッドが使用されました。', E_USER_WARNING);
         $file_name = $prefix . date('YmdHis') . '.csv';
-
-        /* HTTPヘッダの出力 */
-        Header("Content-disposition: attachment; filename={$file_name}");
-        Header("Content-type: application/octet-stream; name={$file_name}");
-        Header('Cache-Control: ');
-        Header('Pragma: ');
+        SC_Response_Ex::headerForDownload($file_name);
 
         /* データを出力 */
@@ -380,3 +354,39 @@
         echo file_get_contents($filepath);
     }
+
+    /**
+     * CSV 出力用のファイルポインタリソースを開く
+     *
+     * @return resource ファイルポインタリソース
+     */
+    public static function &fopen_for_output_csv($filename = 'php://output')
+    {
+        $fp = fopen($filename, 'w');
+
+        stream_filter_append($fp, 'convert.iconv.utf-8/cp932');
+        stream_filter_append($fp, 'convert.eccube_lf2crlf');
+
+        return $fp;
+    }
 }
+
+/**
+ * 改行コードを CRLF に変換するフィルター
+ *
+ * @package php_user_filter
+ * @author Seasoft 塚田将久 (新規作成)
+ * @version $Id$
+ */
+class php_user_filter_lf2crlf extends php_user_filter
+{
+    function filter($in, $out, &$consumed, $closing)
+    {
+        while ($bucket = stream_bucket_make_writeable($in)) {
+            $bucket->data = preg_replace("/[\r\n]+$/", "\r\n", $bucket->data);
+            $consumed += $bucket->datalen;
+            stream_bucket_append($out, $bucket);
+        }
+        return PSFS_PASS_ON;
+    }
+}
+stream_filter_register('convert.eccube_lf2crlf', 'php_user_filter_lf2crlf');
Index: /branches/version-2_13-dev/data/class/pages/admin/system/LC_Page_Admin_System_Bkup.php
===================================================================
--- /branches/version-2_13-dev/data/class/pages/admin/system/LC_Page_Admin_System_Bkup.php	(revision 23124)
+++ /branches/version-2_13-dev/data/class/pages/admin/system/LC_Page_Admin_System_Bkup.php	(revision 23388)
@@ -42,4 +42,7 @@
     );
 
+    /** ヘッダーを出力するか (cbOutputCSV 用) */
+    private $output_header = false;
+
     /**
      * Page を初期化する.
@@ -185,9 +188,8 @@
 
                     // ダウンロード開始
-                    Header("Content-disposition: attachment; filename=${filename}");
-                    Header("Content-type: application/octet-stream; name=${filename}");
-                    header('Content-Length: ' .filesize($dl_file));
-                    readfile ($dl_file);
-                    exit();
+                    SC_Response_Ex::headerForDownload($filename);
+                    header('Content-Length: ' . filesize($dl_file));
+                    readfile($dl_file);
+                    SC_Response_Ex::actionExit();
                     break;
                 }
@@ -289,6 +291,6 @@
             // dataをCSV出力
             $csv_file = $work_dir . $table . '.csv';
-            $fp = fopen($csv_file, 'w');
-            if (!$fp) {
+            $this->fpOutput = fopen($csv_file, 'w');;
+            if (!$this->fpOutput) {
                 return __LINE__;
             }
@@ -297,14 +299,12 @@
             $sql = 'SELECT * FROM ' . $objQuery->conn->quoteIdentifier($table);
 
-            $this->fpOutput =& $fp;
-            $this->first_line = true;
+            $this->output_header = true;
             $success = $objQuery->doCallbackAll(array(&$this, 'cbOutputCSV'), $sql);
-            unset($this->fpOutput);
+
+            fclose($this->fpOutput);
 
             if ($success === false) {
                 return __LINE__;
             }
-
-            fclose($fp);
 
             // タイムアウトを防ぐ
@@ -351,15 +351,13 @@
     public function cbOutputCSV($data)
     {
-        $line = '';
-        if ($this->first_line) {
-            // カラム名
-            $line .= SC_Helper_CSV_Ex::sfArrayToCsv(array_keys($data)) . "\n";
-            $this->first_line = false;
-        }
-        $line .= SC_Helper_CSV_Ex::sfArrayToCsv($data);
-        $line .= "\n";
+        // 1行目のみヘッダーを出力する
+        if ($this->output_header) {
+            fputcsv($this->fpOutput, array_keys($data));
+            $this->output_header = false;
+        }
+        fputcsv($this->fpOutput, $data);
         SC_Utils_Ex::extendTimeOut();
 
-        return fwrite($this->fpOutput, $line);
+        return true;
     }
 
