2013-02-20 96 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资源?