Index: /branches/version-2_11-dev/data/class/pages/mypage/LC_Page_Mypage_History.php
===================================================================
--- /branches/version-2_11-dev/data/class/pages/mypage/LC_Page_Mypage_History.php	(revision 21071)
+++ /branches/version-2_11-dev/data/class/pages/mypage/LC_Page_Mypage_History.php	(revision 21354)
@@ -96,4 +96,6 @@
         $this->tpl_arrOrderDetail = $this->setMainListImage($this->tpl_arrOrderDetail);
         $objPurchase->setDownloadableFlgTo($this->tpl_arrOrderDetail);
+        // モバイルダウンロード対応処理
+        $this->lfSetAU($this->tpl_arrOrderDetail);
         // 受注メール送信履歴の取得
         $this->tpl_arrMailHistory = $this->lfGetMailHistory($order_id);
@@ -164,3 +166,41 @@
         return $arrOrderDetails;
     }
+
+    /**
+     * 購入履歴商品にMIMETYPE、ファイル名をセット
+     *
+     * @param $arrOrderDetail 購入履歴の配列
+     * @return array MIMETYPE、ファイル名をセットした購入履歴の配列
+     */
+    function lfSetMimetype($arrOrderDetails) {
+        $objHelperMobile = new SC_Helper_Mobile_Ex();
+        $i = 0;
+        foreach ($arrOrderDetails as $arrOrderDetail) {
+            $objQuery =& SC_Query_Ex::getSingletonInstance();
+            $arrProduct = $objQuery->select('down_realfilename,down_filename', 'dtb_products_class', 'product_id = ? AND product_class_id = ?', array($arrOrderDetail['product_id'],$arrOrderDetail['product_class_id']));
+            $arrOrderDetails[$i]['mime_type'] = $objHelperMobile->getMimeType($arrProduct[0]['down_realfilename']);
+            $arrOrderDetails[$i]['down_filename'] = $arrProduct[0]['down_filename'];
+            $i++;
+        }
+        return $arrOrderDetails;
+    }
+
+    /**
+     * 特定キャリア（AU）モバイルダウンロード処理
+     * キャリアがAUのモバイル端末からダウンロードする場合は単純に
+     * Aタグでダウンロードできないケースがある為、対応する。
+     *
+     * @param integer $order_id 注文番号
+     * @param $arrOrderDetail 購入履歴の配列
+     */
+    function lfSetAU($arrOrderDetails) {
+        $this->isAU = false;
+        // モバイル端末かつ、キャリアがAUの場合に処理を行う
+        if (SC_Display_Ex::detectDevice() == DEVICE_TYPE_MOBILE && SC_MobileUserAgent::getCarrier() == 'ezweb'){
+            // MIMETYPE、ファイル名のセット
+            $this->tpl_arrOrderDetail = $this->lfSetMimetype($arrOrderDetails);
+            $this->phpsessid = $_GET['PHPSESSID'];
+            $this->isAU = true;
+        }
+    }
 }
Index: /branches/version-2_11-dev/data/class/pages/mypage/LC_Page_Mypage_DownLoad.php
===================================================================
--- /branches/version-2_11-dev/data/class/pages/mypage/LC_Page_Mypage_DownLoad.php	(revision 21335)
+++ /branches/version-2_11-dev/data/class/pages/mypage/LC_Page_Mypage_DownLoad.php	(revision 21354)
@@ -44,5 +44,7 @@
      * Application/octet-streamで対応出来ないファイルタイプのみ拡張子をキーに記述する
      * 拡張子が本配列に存在しない場合は $defaultContentTypeを利用する */
-    var $arrContentType = array('apk' => 'application/vnd.android.package-archive');
+    var $arrContentType = array('apk' => 'application/vnd.android.package-archive',
+                                'pdf' => 'application/pdf'
+        );
 
     // }}}
@@ -132,4 +134,186 @@
         // SC_DisplayやSC_Responseに大容量ファイルレスポンスが実装されたら移行可能だと思います。
 
+        // ダウンロード実行 モバイル端末はダウンロード方法が異なる
+        if (SC_Display_Ex::detectDevice() == DEVICE_TYPE_MOBILE){
+            // キャリアがAUのモバイル端末はさらにダウンロード方法が異なる
+            if (SC_MobileUserAgent::getCarrier() == 'ezweb'){
+                // AUモバイル
+                $this->lfMobileAuDownload($realpath,$sdown_filename);
+            }else{
+                // AU以外のモバイル
+                $this->lfMobileDownload($realpath,$sdown_filename);
+            }
+        }else{
+            // PC、スマフォ
+            $this->lfDownload($realpath,$sdown_filename);
+        }
+    }
+
+    /**
+     * 商品情報の読み込みを行う.
+     *
+     * @param integer $customer_id 会員ID
+     * @param integer $order_id 受注ID
+     * @param integer $product_id 商品ID
+     * @param integer $product_class_id 商品規格ID
+     * @return array 商品情報の配列
+     */
+    function lfGetRealFileName($customer_id, $order_id, $product_id, $product_class_id) {
+        $objQuery = new SC_Query_Ex();
+        $col = <<< __EOS__
+            pc.product_id AS product_id,
+            pc.product_class_id AS product_class_id,
+            pc.down_realfilename AS down_realfilename,
+            pc.down_filename AS down_filename,
+            o.order_id AS order_id,
+            o.customer_id AS customer_id,
+            o.payment_date AS payment_date,
+            o.status AS status
+__EOS__;
+
+        $table = <<< __EOS__
+            dtb_products_class pc,
+            dtb_order_detail od,
+            dtb_order o
+__EOS__;
+
+        $dbFactory = SC_DB_DBFactory_Ex::getInstance();
+        $where = "o.customer_id = ? AND o.order_id = ? AND pc.product_id = ? AND pc.product_class_id = ?";
+        $where .= " AND " . $dbFactory->getDownloadableDaysWhereSql('o');
+        $where .= " = 1";
+        $arrRet = $objQuery->select($col, $table, $where,
+                                    array($customer_id, $order_id, $product_id, $product_class_id));
+        return $arrRet[0];
+    }
+
+    /* パラメーター情報の初期化 */
+    function lfInitParam(&$objFormParam) {
+        $objFormParam->addParam("customer_id", "customer_id", INT_LEN, 'n', array("EXIST_CHECK","NUM_CHECK"));
+        $objFormParam->addParam("order_id", "order_id", INT_LEN, 'n', array("EXIST_CHECK", "NUM_CHECK"));
+        $objFormParam->addParam("product_id", "product_id", INT_LEN, 'n', array("EXIST_CHECK","NUM_CHECK"));
+        $objFormParam->addParam("product_class_id", "product_class_id", INT_LEN, 'n', array("EXIST_CHECK","NUM_CHECK"));
+    }
+
+    /* 入力内容のチェック */
+    function lfCheckError(&$objFormParam) {
+        $objErr = new SC_CheckError_Ex($objFormParam->getHashArray());
+        $objErr->arrErr = $objFormParam->checkError();
+        return $objErr->arrErr;
+    }
+
+    /**
+     * モバイル端末用ヘッダー出力処理
+     *
+     * @param string $realpath ダウンロードファイルパス
+     * @param string $sdown_filename ダウンロード時の指定ファイル名
+     */
+    function lfMobileHeader($realpath,$sdown_filename){
+        $objHelperMobile = new SC_Helper_Mobile_Ex();
+        //ファイルの拡張子からコンテンツタイプを取得する
+        $mime_type = $objHelperMobile->getMIMEType($realpath);
+        header('Content-Type: ' . $mime_type);
+        header("Content-Disposition: attachment; filename=" . $sdown_filename);
+        header('Accept-Ranges: bytes');
+        header("Last-Modified: " . gmdate("D,d M Y H:i:s") . " GMT");
+        header("Cache-Control: public");
+    }
+
+    /**
+     * モバイル端末（AU）ダウンロード処理
+     *
+     * @param string $realpath ダウンロードファイルパス
+     * @param string $sdown_filename ダウンロード時の指定ファイル名
+     */
+    function lfMobileAuDownload($realpath,$sdown_filename){
+        //モバイル用ヘッダー出力
+        $this->lfMobileHeader($realpath,$sdown_filename);
+        //ファイルサイズを取得する
+        $file_size = filesize($realpath);
+        //読み込み
+        $fp = fopen( $realpath, "rb" );
+        if (isset($_SERVER['HTTP_RANGE'])) {
+            // 二回目以降のリクエスト
+            list($range_offset, $range_limit) = sscanf($_SERVER['HTTP_RANGE'], "bytes=%d-%d");
+            $content_range = sprintf("bytes %d-%d/%d", $range_offset, $range_limit, $file_size);
+            $content_length = $range_limit - $range_offset + 1;
+            fseek( $fp, $range_offset, SEEK_SET );
+            header("HTTP/1.1 206 Partial Content" );
+            header("Content-Lenth: " . $content_length);
+            header("Content-Range: " . $content_range);
+        } else {
+            // 一回目のリクエスト
+            $content_length = $file_size;
+            header("Content-Length: " . $content_length);
+        }
+        echo fread( $fp, $content_length ) ;
+        ob_flush();
+        flush();
+    }
+
+    /**
+     * モバイル端末（AU以外）ダウンロード処理
+     *
+     * @param string $realpath ダウンロードファイルパス
+     * @param string $sdown_filename ダウンロード時の指定ファイル名
+     */
+    function lfMobileDownload($realpath,$sdown_filename){
+        //モバイル用ヘッダー出力
+        $this->lfMobileHeader($realpath,$sdown_filename);
+        //ファイルサイズを取得する
+        $file_size = filesize($realpath);
+
+        //出力用バッファをクリアする
+        @ob_end_clean();
+
+        //HTTP_RANGEがセットされていた場合
+        if (isset($_SERVER['HTTP_RANGE'])) {
+            // 二回目以降のリクエスト
+            list($a, $range) = explode("=",$_SERVER['HTTP_RANGE'],2);
+            list($range) = explode(",",$range,2);
+            list($range, $range_end) = explode("-", $range);
+            $range=intval($range);
+
+            if (!$range_end) {
+                $range_end=$file_size-1;
+            } else {
+                $range_end=intval($range_end);
+            }
+
+            $new_length = $range_end-$range+1;
+            header("HTTP/1.1 206 Partial Content");
+            header("Content-Length: $new_length");
+            header("Content-Range: bytes $range-$range_end/$file_size");
+        } else {
+            // 一回目のリクエスト
+            $new_length=$file_size;
+            header("Content-Length: ".$file_size);
+        }
+
+        //ファイル読み込み
+        $chunksize = 1*(DOWNLOAD_BLOCK*1024);
+        $bytes_send = 0;
+        if ($realpath = fopen($realpath, 'r')) {
+            // 二回目以降のリクエスト
+            if (isset($_SERVER['HTTP_RANGE'])) fseek($realpath, $range);
+
+            while (!feof($realpath) && (!connection_aborted()) && ($bytes_send<$new_length)) {
+                $buffer = fread($realpath, $chunksize);
+                print($buffer);
+                ob_flush();
+                flush();
+                $bytes_send += strlen($buffer);
+            }
+            fclose($realpath);
+        }
+        die();
+    }
+
+    /**
+     * モバイル端末以外ダウンロード処理
+     *
+     * @param string $realpath ダウンロードファイルパス
+     * @param string $sdown_filename ダウンロード時の指定ファイル名
+     */
+    function lfDownload($realpath,$sdown_filename){
         // 拡張子を取得
         $extension = pathinfo($realpath, PATHINFO_EXTENSION);
@@ -162,5 +346,4 @@
             exit;
         }
-
         while (!feof($handle)) {
             echo(fread($handle, DOWNLOAD_BLOCK*1024));
@@ -172,56 +355,4 @@
 
     /**
-     * 商品情報の読み込みを行う.
-     *
-     * @param integer $customer_id 会員ID
-     * @param integer $order_id 受注ID
-     * @param integer $product_id 商品ID
-     * @param integer $product_class_id 商品規格ID
-     * @return array 商品情報の配列
-     */
-    function lfGetRealFileName($customer_id, $order_id, $product_id, $product_class_id) {
-        $objQuery = new SC_Query_Ex();
-        $col = <<< __EOS__
-            pc.product_id AS product_id,
-            pc.product_class_id AS product_class_id,
-            pc.down_realfilename AS down_realfilename,
-            pc.down_filename AS down_filename,
-            o.order_id AS order_id,
-            o.customer_id AS customer_id,
-            o.payment_date AS payment_date,
-            o.status AS status
-__EOS__;
-
-        $table = <<< __EOS__
-            dtb_products_class pc,
-            dtb_order_detail od,
-            dtb_order o
-__EOS__;
-
-        $dbFactory = SC_DB_DBFactory_Ex::getInstance();
-        $where = "o.customer_id = ? AND o.order_id = ? AND pc.product_id = ? AND pc.product_class_id = ?";
-        $where .= " AND " . $dbFactory->getDownloadableDaysWhereSql('o');
-        $where .= " = 1";
-        $arrRet = $objQuery->select($col, $table, $where,
-                                    array($customer_id, $order_id, $product_id, $product_class_id));
-        return $arrRet[0];
-    }
-
-    /* パラメーター情報の初期化 */
-    function lfInitParam(&$objFormParam) {
-        $objFormParam->addParam("customer_id", "customer_id", INT_LEN, 'n', array("EXIST_CHECK","NUM_CHECK"));
-        $objFormParam->addParam("order_id", "order_id", INT_LEN, 'n', array("EXIST_CHECK", "NUM_CHECK"));
-        $objFormParam->addParam("product_id", "product_id", INT_LEN, 'n', array("EXIST_CHECK","NUM_CHECK"));
-        $objFormParam->addParam("product_class_id", "product_class_id", INT_LEN, 'n', array("EXIST_CHECK","NUM_CHECK"));
-    }
-
-    /* 入力内容のチェック */
-    function lfCheckError(&$objFormParam) {
-        $objErr = new SC_CheckError_Ex($objFormParam->getHashArray());
-        $objErr->arrErr = $objFormParam->checkError();
-        return $objErr->arrErr;
-    }
-
-    /**
      * デストラクタ.
      *
Index: /branches/version-2_11-dev/data/class/helper/SC_Helper_Mobile.php
===================================================================
--- /branches/version-2_11-dev/data/class/helper/SC_Helper_Mobile.php	(revision 21185)
+++ /branches/version-2_11-dev/data/class/helper/SC_Helper_Mobile.php	(revision 21354)
@@ -35,4 +35,48 @@
 class SC_Helper_Mobile {
 
+    /** 基本MimeType */
+    var $defaultMimeType = 'application/force-download';
+
+    /** 拡張MimeType配列
+     * Application/octet-streamで対応出来ないファイルタイプのみ拡張子をキーに記述する
+     * 拡張子が本配列に存在しない場合は application/force-download を利用する */
+    var $arrMimetypes = array(
+            'html'=> 'text/html',
+            'css' => 'text/css',
+            'hdml'=> 'text/x-hdml',
+            'mmf' => 'application/x-smaf',
+            'jpeg'=> 'image/jpeg',
+            'jpg' => 'image/jpeg',
+            'gif' => 'image/gif',
+            'png' => 'image/png',
+            'bmp' => 'image/x-ms-bmp',
+            'amc' => 'application/x-mpeg',
+            '3g2' => 'video/3gpp2',
+            '3gp' => 'video/3gpp',
+            'jam' => 'application/x-jam',
+            'kjx' => 'application/x-kjx',
+            'jar' => 'application/java-archive',
+            'jad' => 'text/vnd.sun.j2me.app-descriptor',
+            'swf' => 'application/x-shockwave-flash',
+            'dmt' => 'application/x-decomail-template',
+            'khm' => 'application/x-kddi-htmlmail',
+            'hmt' => 'application/x-htmlmail-template',
+            'ucm' => 'application/x-ucf-package',
+            'ucp' => 'application/x-ucf-package',
+            'pdf' => 'application/pdf',
+            'wma' => 'audio/x-ms-wma',
+            'asf' => 'video/x-ms-asf',
+            'wax' => 'audio/x-ms-wax',
+            'wvx' => 'video/x-ms-wvx',
+            'wmv' => 'video/x-ms-wmv',
+            'asx' => 'video/asx',
+            'txt' => 'text/plain',
+            'exe' => 'application/octet-stream',
+            'zip' => 'application/zip',
+            'doc' => 'application/msword',
+            'xls' => 'application/vnd.ms-excel',
+            'ppt' => 'application/vnd.ms-powerpoint'
+        );
+
     /**
      * EC-CUBE がサポートする携帯端末かどうかをチェックする。
@@ -238,6 +282,9 @@
         ob_start(array('SC_MobileImage_Ex', 'handler'));
 
-        // 全角カタカナを半角カタカナに変換する。
-        ob_start(create_function('$buffer', 'return mb_convert_kana($buffer, "k", "SJIS-win");'));
+        //download.phpに対してカタカナ変換をするとファイルが壊れてしまうため回避する
+        if ($_SERVER['SCRIPT_FILENAME'] != HTML_REALDIR . "mypage/download.php") {
+            // 全角カタカナを半角カタカナに変換する。
+            ob_start(create_function('$buffer', 'return mb_convert_kana($buffer, "k", "SJIS-win");'));
+        }
 
         // 内部エンコーディングから Shift JIS に変換する。
@@ -460,4 +507,20 @@
         return false;
     }
+
+    /**
+     * ファイルのMIMEタイプを判別する
+     *
+     * @param string $filename ファイル名
+     * @return string MIMEタイプ
+     */
+    function getMimeType($filename) {
+        //ファイルの拡張子からコンテンツタイプを決定する
+        $file_extension = strtolower(substr(strrchr($filename,"."),1));
+        $mime_type = $this->defaultMimeType;
+        if(array_key_exists($file_extension, $this->arrMimetypes)){
+            $mime_type = $this->arrMimetypes[$file_extension];
+        }
+        return $mime_type;
+    }
 }
 ?>
Index: /branches/version-2_11-dev/data/class/session/sessionfactory/SC_SessionFactory_UseRequest.php
===================================================================
--- /branches/version-2_11-dev/data/class/session/sessionfactory/SC_SessionFactory_UseRequest.php	(revision 20970)
+++ /branches/version-2_11-dev/data/class/session/sessionfactory/SC_SessionFactory_UseRequest.php	(revision 21354)
@@ -158,4 +158,11 @@
         if (!isset($sessionId)) {
             $sessionId = @$_GET[session_name()];
+            // AU動画音声ファイルダウンロード対策
+            // キャリアがAUで、動画、音声ファイルをダウンロードする際に
+            // SESSIONIDの後に余計なパラメータが付与され、セッションが無効になるケースがある
+            if (SC_MobileUserAgent::getCarrier() == "ezweb") {
+                $idArray = split("\?", $sessionId);
+                $sessionId = $idArray[0];
+            }
         }
         if (!isset($sessionId)) {
Index: /branches/version-2_11-dev/data/Smarty/templates/mobile/mypage/history.tpl
===================================================================
--- /branches/version-2_11-dev/data/Smarty/templates/mobile/mypage/history.tpl	(revision 21000)
+++ /branches/version-2_11-dev/data/Smarty/templates/mobile/mypage/history.tpl	(revision 21354)
@@ -46,5 +46,11 @@
 <!--{if $orderDetail.product_type_id == $smarty.const.PRODUCT_TYPE_DOWNLOAD}-->
 <!--{if $orderDetail.is_downloadable}-->
+<!--{if $isAU == false}-->
 <a target="_self" href="<!--{$smarty.const.ROOT_URLPATH}-->mypage/download.php?order_id=<!--{$tpl_arrOrderData.order_id}-->&product_id=<!--{$orderDetail.product_id}-->&product_class_id=<!--{$orderDetail.product_class_id}-->">ダウンロード</a><br>
+<!--{else}-->
+<object data="<!--{$smarty.const.ROOT_URLPATH}-->mypage/download.php?order_id=<!--{$tpl_arrOrderData.order_id}-->&product_id=<!--{$orderDetail.product_id}-->&product_class_id=<!--{$orderDetail.product_class_id}-->&PHPSESSID=<!--{$phpsessid}-->" copyright="no" standby="ダウンロード" type="<!--{$orderDetail.mime_type}-->">
+<param name="title" value="<!--{$orderDetail.down_filename}-->" valuetype="data">
+</object><br>
+<!--{/if}-->
 <!--{else}-->
 <!--{if $orderDetail.payment_date == "" && $orderDetail.effective == "0"}-->
