2013-02-20 164 views
1

我需要生成併發送日誌數據到csv格式的郵件。這裏是我的代碼:如何閱讀和發送資源?

public function sendMail(){ 
    $csv = $this->createCSV(); 
    $subject = $this->getMessage('subject'); 
    $message = $this->getMessage('message'); 
    $headers = $this->generateHeaders($csv, $message); 

    mail('[email protected]', $subject, $message, $headers); 
} 

private function createCSV(){ 
    $data = $this->getAVG(); 

    $csv = fopen('php://temp', 'w+'); 

    // long statistics generation 

    fclose($csv); 

    return $csv; 
} 

private function generateHeaders($file, $message){ 
    $boundary = md5(uniqid(time())); 

    $headers = 'MIME-Version: 1.0'."\r\n"; 
    $headers .= 'Content-Type: multipart/mixed; boundary="'.$boundary."\"\r\n"; 
    $headers .= 'From: [email protected]'.$_SERVER['SERVER_NAME']."\r\n"; 

    $headers .= '--'.$boundary."\r\n"; 

    $headers .= "Content-Type: text/html; charset=utf-8\r\n"; 
    $headers .= "Content-Transfer-Encoding: base64\r\n"; 
    $headers .= "\r\n"; 
    $headers .= chunk_split(base64_encode($message)); 

    $headers .= '--'.$boundary."\r\n"; 

    $headers .= "Content-Type: text/csv; name=\"ServersLogs.csv\"\r\n"; 
    $headers .= "Content-Transfer-Encoding: base64\r\n"; 
    $headers .= "Content-Disposition: attachment; filename=\"ServersLogs.csv\"\r\n"; 
    $headers .= "\r\n"; 
    $headers .= chunk_split(base64_encode(readfile($file))); 

    $headers .= "\r\n--".$boundary."--\r\n"; 

    return $headers; 
} 

的問題是,我不能保存文件的服務器上,所以我用php://,之後卻無法讀取文件...

+0

你有沒有試過將文件保存在'/ tmp'上?你應該有權限在那裏。 – fedorqui 2013-02-20 09:49:26

回答

0

$csv = fopen('php://temp', 'w+'); - 這條線將創建資源(處理程序),它不是文件的名稱。

fclose($csv); - 在此行資源已關閉,不能再使用。
因此return $csv;不會返回任何可用的東西。

readfile($file) - 此函數需要filename作爲第一個參數,而不是封閉資源的處理程序。

我不明白你爲什麼需要文件或臨時內存存儲 - 只需使用變量(不是全局的)。無論如何,整個數據將在內存中。

+0

我使用'fputcsv' – user1692333 2013-02-20 10:41:37

+0

創建沒有此功能的csv非常簡單。 – 2013-02-20 10:42:36

0

您應該在generateHeaders()調用並使用fread()而不是readfile()後關閉()您的文件。在閱讀之前不要忘記fseek($ file,0,SEEK_SET)。

順便說一下,您將您的數據保存到臨時文件,只是爲了在generateHeaders()中再次讀取它。爲什麼不將生成的統計數據傳遞給generateHeaders()而不是$ file資源?