2011-07-02 66 views
0

我有這個page,應該是一首歌曲的下載。下載在Firefox對我的作品,但在Chrome和Safari沒有happens..here是我的代碼文件傳輸代碼在我的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!'); 
     } 
    } 
} 

我已經嘗試了各種不同的東西來得到這個工作,但沒有在兩個瀏覽器發生..任何想法或幫助將不勝感激...

+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你能給我們一個特定的下載網址嗎?我無法在您發佈的網頁上找到下載鏈接。 – 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。 –