2011-07-02 4 views
0

私はこれを持っていますpageは、曲のダウンロードであるはずです。ダウンロードは私のためのFirefoxで動作しますが、ChromeとSafariの何で私はこの仕事を得るために異なるもののすべての種類を試してみましたが、何も2つのブラウザで起こっていないPHPでファイル転送コードが正しいですか?

public function download() { 
    if (isset($this->request->get['order_download_id'])) { 
     $order_download_id = $this->request->get['order_download_id']; 
    } else { 
     $order_download_id = 0; 
    } 
    $download_info = $this->db->query("SELECT * FROM " . DB_PREFIX . "order_download od LEFT JOIN `" . DB_PREFIX . "order` o ON (od.order_id = o.order_id) WHERE o.customer_id = '" . (int)$this->customer->getId(). "' AND o.order_status_id > '0' AND o.order_status_id = '" . (int)$this->config->get('config_download_status') . "' AND od.order_download_id = '" . (int)$order_download_id . "'"); 

    if ($download_info->row) { 
     $file = DIR_DOWNLOAD . $download_info->row['filename']; 
     $mask = basename($download_info->row['mask']); 
     $mime = 'application/octet-stream'; 
     $encoding = 'binary'; 

     if (!headers_sent()) { 
      if (file_exists($file)) { 
       header('Pragma: public'); 
       header('Expires: 0'); 
       header('Content-Description: File Transfer'); 
       header('Content-Type: ' . $mime); 
       header('Content-Transfer-Encoding: ' . $encoding); 
       header('Content-Disposition: attachment; filename="' . ($mask ? $mask : basename($file)) . '"'); 
       header('Content-Length: ' . filesize($file)); 
       $file = readfile($file, 'rb'); 
       print($file); 
      } else { 
       exit('Error: Could not find file ' . $file . '!'); 
      } 
     } else { 
      exit('Error: Headers already sent out!'); 
     } 
    } 
} 

私のコードですhappens..here ..あなたのアイデアや助けを歓迎するでしょう。

+0

私はreadfileの戻り値を出力したくないと思います。既にコンテンツの長さを送っていて、予期せぬことです(さらに、受信者側のファイルが壊れてしまう)。 –

+0

リダイレクトを削除した場合、ファイルを取得しますか?私はIEについて十分に分かっていませんが、ヘッダーを読んで、応答本体を処理する前にリダイレクトストリームに従っているだけかもしれません。 – Candide

+0

これまでのところファイルがありません。 – Trace

答えて

3

readfileは送信されたバイト数を返します。印刷する必要はありません。行print($file);を削除する必要があります。それ以外の場合は、Content-Lengthよりも多くのバイト数を送信し、一部のHTTPクライアントが応答を破棄するようになります。

また、このような

"\r\nLocation: http://evil.com\r\n\r\n<script>alert('XSS');</script> 

として奇妙なファイル名を考えるあなたは正しくそれを処理していますか?

+0

私は行を削除し、まだ行っていません...他のアイデア – Trace

+0

@Tamer特定のダウンロードURLを教えてください。あなたが投稿したページにダウンロードリンクが見つかりません。 – phihag

+0

http://royaltyfreesoundbank.com/jgsnmuegvuzebazfoz/index.php?route=module/cart/download&order_download_id=66 – Trace

0

クラッシュします

header('Content-Disposition: attachment; filename="'.$file_name_with_space. '"'); 

の近くに構文を参照するか、それが適切に他の書かれている場合はゲームが引用符でのみ、それは文字列の一部として扱われます。ここで

header("Content-Disposition: attachment; filename='".$file_name_with_space."'"); 

することができ。

すべてのブラウザで動作します。 IE、FF、Chrome、SAFARI私は個人的にあまりにもそれをチェックした。

+0

これは非ASCII文字では機能しません。 RFC 6266を参照してください。 –

関連する問題