2013-01-06 24 views
0

說我有一個表objects上傳文本文件來分析多個模型數據

CREATE TABLE objects (
    id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY, 
    name VARCHAR(50), 
    someinfo VARCHAR(255), 
); 

而且像這樣的文本文件:

name,someinfo 
"firstname","firstinfo" 
"secondname","secondinfo" 
... 

如何上傳這個文本文件中的CakePHP處理數據並創建對象?處理不是問題,我已經覆蓋了。但我不知道如何上傳文件。

注意:這些文件的大小最多可達300MB。

編輯
我試着使用LOAD DATA INFILE作爲dogmatic69建議,使用此代碼:

$filefullname = $this->request->data['File']['file']['tmp_name']; 
debug($filefullname); 
$query = 'LOAD DATA LOW_PRIORITY INFILE "'.$filefullname.'" INTO TABLE agencies FIELDS TERMINATED BY "," OPTIONALLY ENCLOSED BY """" LINES TERMINATED BY "\r" IGNORE 1 LINES'; 
$this->Agency->query($query); 

不過,我得到以下輸出:

'C:\Windows\Temp\phpB413.tmp' 
Error: SQLSTATE[HY000]: General error: 29 File 'C:\ProgramData\MySQL\MySQL Server 5.5\data\WindowsTempphpB413.tmp' not found (Errcode: 2) 
SQL Query: LOAD DATA LOW_PRIORITY INFILE "C:\Windows\Temp\phpB413.tmp" INTO TABLE agencies FIELDS TERMINATED BY "," OPTIONALLY ENCLOSED BY """" LINES TERMINATED BY "\r" IGNORE 1 LINES 
+0

使用cakephp上傳文件的選項與使用php相同 - 您提交表單,使用applet或(例如)ftp文件到服務器。即如果你知道如何上傳一個文件與PHP - 你知道如何上傳一個文件與cakephp – AD7six

回答

2

從@馬克答案只覆蓋了你所需要的一小部分,所以這裏是更多:

順便說一句savants upload plugin可能比什麼聯更受歡迎。通過星星和分叉大約兩倍像上傳包一樣流行。

您需要將csv數據解析爲可保存的蛋糕格式。 here是爲了這樣做的幾個類。查看tests的使用情況

由於您將要避免的海量數據爲saveAll(),因爲它會爲每行創建一個插入。使用this瞭解有關執行批量插入的一些想法。

老實說,如果你要導入300MB的CSV文件,你應該使用MySQL LOAD DATA INFILE,這要快得多。 http://dev.mysql.com/doc/refman/5.1/en/load-data.html

+0

感謝您的提示!我正在測試'LOAD DATA INFILE'而不移動上傳的文件,但會發生錯誤。看到編輯的問題。 – nhaarman

+0

這些文件必須是可讀的mysql,我認爲上傳的文件只能被你的網絡服務器讀取。 – dogmatic69