2013-04-09 10 views
0

我正在爲用戶所需的軟件包選擇創建發票。 PDF文件正在創建(但它需要一些時間),而代碼檢查文件。該文件存在。這是該文件的地址;在codeigniter中未檢索到文件路徑

C:/wamp/www/proposal/file/invoice/Basic_52_60.pdf 

這是文件的正確路徑。我將這個路徑傳遞給另一個控制器中的函數,

redirect('email/email_invoice/'.$file); 

當我測試在email_invoice函數的文件路徑,它顯示只有c:

c: 

在路徑中的斜線不被傳送。我不知道到底是什麼問題。

回答

1

CodeIgniter將URL的每個段都視爲控制器和方法之後的參數。所以你基本上將7個變量傳遞給Email::email_invoice()方法。

你可以使用某種編碼的把它作爲一個變量,然後如它的另一面解碼:

$file = base64_encode($file); 
redirect('email/email_invoice/' . $file); 

然後在Email.php:

public function email_invoice($file) { 
    $file = base64_decode($file); 
} 

或者你可以通過它作爲get參數:

redirect('email/email_invoice/?file=' . $file); 

public function email_invoice() { 
    $file = $this->input->get('file'); 
} 

後者需要啓用$ _GET數組,它是n ot默認。

更新 - 使用Flashdata

基於一些我以爲我會更新這個答案的評論。 base64_encode()可能會導致將打破網址字符,所以你需要使用:

$file = urlencode(base64_encode($file)); 
redirect('email/email_invoice/' . $file); 

而在另一邊:

public function email_invoice($file) { 
    $file = urldecode(base64_decode($file)); 
} 

由於OP指出$ _ GET變量可以被操縱離開你開放至directory traversal attacks或其他漏洞。即使做得對,你也需要額外的安全代碼。編碼很容易被發現和改變。

文件路徑可能不應該在URL中進行。 POST數據也可以被操縱,即使它不太明顯。通過默默無聞的安全性根本不是安全的。更好的方法是使用flashdata

$this->session->set_flashdata('email_invoice_pdf', $file); 
redirect('email/email_invoice/'); 

然後在你的控制器:

public function email_invoice() { 
    $file = $this->session->flashdata('email_invoice_pdf'); 
} 

就是這樣。該會話用於將文件路徑傳送到下一個頁面請求,但在此之後它不見了。

+0

在2.1.3+'$ _GET'訪問默認啓用。它是CI最初禁用的基於查詢字符串的URL。 – 2013-04-09 19:59:52

+0

'urlencode()'是另一個選項,用於通過URL中傳遞項目的URL,其中包含斜槓和其他URI字符。 – 2013-04-09 20:00:26

+0

我測試urlencode,我不斷收到錯誤,所以我去base64_encode – 2013-04-09 20:20:39