上传文本文件以解析多个模型数据

时间:2013-01-06 20:50:53

标签: php cakephp file-upload

说我有一张桌子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

2 个答案:

答案 0 :(得分:2)

@Mark的答案只涵盖了你需要的一小部分,所以这里有更多:

Btw savants upload plugin可能比链接的更受欢迎。走向星星并将其大概两次分叉,与uploadpack一样受欢迎。

您需要将csv数据解析为适合保存的蛋糕格式。 here就是这样做的几个班级。查看tests的使用情况

您希望避免使用大量数据saveAll(),因为它会为每一行创建一个插入内容。有关批量插入的一些想法,请使用this

老实说,如果您要导入300MB CSV文件,那么您应该使用MySQL LOAD DATA INFILE,这要快得多。 http://dev.mysql.com/doc/refman/5.1/en/load-data.html

答案 1 :(得分:1)

你最好使用第三方库,最受欢迎的是:uploadpack:https://github.com/szajbus/uploadpack