html代码:
<form action="/message/index/csv" encType="multipart/form-data" method="post" target="uploadcvs">
<div><input type="file" name="csvfile"/> <input type="submit" value="上传"></div>
<div id="upload_info" style="width:100%;border:1px solid #809db9;display:none" ></div>
</form>
target="uploadcvs",添加target时调试代码不好调试,建议调试时去掉这行代码
php代码:
public function csvAction(){
//获取上传文件名$fileinfo,包含文件的扩展
$fileinfo = pathinfo($_FILES['csvfile']['name']);
//判断文件扩展是不是csv
if(!in_array(strtolower($fileinfo['extension']),array('csv'))){
$feed = array('status'=>'ext');
//判断文件的大小
}else if($_FILES['csvfile']['size'] > 1*1024*1024){
$feed = array('status'=>'size');
}else{
//成功时数组
$succdata = array();
//错误时数组
$errdata = array();
//计数,计算多少行
$count = 0;
//打开临时文件,只读形式
$handle = fopen($_FILES['csvfile']['tmp_name'],"r");
//获取数据库中的username信息
$userMongo = new Application_Model_DbTable_MongoUsers();
$dbUsers = $userMongo->findAll(array(),array('login.username'=>true));
//把用户的username信息写入$users
$users = array();
foreach($dbUsers as $user){
if(isset($user['login']['username']))
$users[] = $user['login']['username'];
}
//逐行读取csv文件信息fgetcsv,fgetcsv($handle)
while ($row = fgetcsv($handle)) {
//读一行count就累加,这样就可以知道读了多少行
$count ++ ;
foreach($users as $user){
//判断$row[0]是不是手机号&&$row[0]是不是等于$user也就是$users中是否有这条记录
//判断成功时,把这条手机号写入数组$succdata
if(preg_match('/^1(3|4|5|8)\d{9}$/',$row[0]) && $user==$row[0]){
$succdata[$row[0]] = (string)$row[0];
break;
}
}
//判断$succdata[$row[0]]是否存在,不存在写入$errdata
if(!isset($succdata[$row[0]])){
$errdata[$row[0]] = $row[0];
}
}
//关闭文件
fclose($handle);
//把上传的cvs文件存到自己的项目中
$url = $this->_helper->Upload->msgcsv($_FILES['csvfile'], $succdata, $errdata);
//$count信息是关于csv文件有多少行记录,成功多少行,失败多少行
$count = array('original'=>$count, 'success'=>count($succdata), 'error'=>count($errdata));
//$feed,这里状态是成功的,count, 与 url 。
//count是为了查看是否有失败的,url是为了查看失败的列表信息(因为上传时换回了3个文件,查看失败文件)
$feed = array('status'=>'succ','count'=>$count, 'url'=>$url);
}
//把数组json化 json_encode() json_encode()json编码
$feed = json_encode($feed);
//callback()函数 <script>parent.callback(".$feed.")</script>
echo "<script>parent.callback(".$feed.")</script>";
exit;
}
js代码:
//data就是".$feed."
function callback(data){
try{
if(data.status =='ext'){
alert('文件类型不正确');
return false;
}else if(data.status == 'size'){
alert('文件不能超过1M');
return false;
}else if(data.status == 'succ'){
//parseInt将字符串转化为整型 parseInt
var html = parseInt(data.count.error) > 0 ? ' <a href="<?php echo UPLOAD_IMAGE_PATH;?>'+data.url.error+'">查看失败列表</a>' : '';
//成功的条数,失败的条数
$('#upload_info').html('成功导入:'+data.count.success+';失败:'+data.count.error+html);
$('#upload_info').show();
$('input[name=step3_hidden]').val(data.url.success);
}
}catch(e){
alert('解析出错,请检查文件格式.');
}
return false;
}
Upload.php文件
<?php
//上传处理
class Ata_Controller_Action_Helper_Upload extends Zend_Controller_Action_Helper_Abstract {
//通知csv文件
public function MsgCsv(&$source, $succdata, $errdata){
//原cvs保留
//文件存放目录
$publicPath = realpath(APPLICATION_PATH."/../public/upload").'/';
$csvPath = "msgcsv/".date('Y').'/'.date('m')."/";
$path = $publicPath.$csvPath;
//创建目录
$this->mkdirs($path);
//uniqid() 函数基于以微秒计的当前时间,生成一个唯一的 ID。uniqid()
$filename = uniqid();
//获取文件的扩展名
$ext = pathinfo($source['name'], PATHINFO_EXTENSION);
//创建空文件,目录,文件名,扩展
$filepath = $path.$filename.'_org.'.$ext;
//move_uploaded_file(),将上传的文件移动到新位置
move_uploaded_file($source['tmp_name'], $filepath);
//正确csv创建
$content = '';
//创建空文件,目录,文件名,扩展
$succfile = $path.$filename.'_succ.'.$ext;
//把$succdata的内容写入$content;
foreach($succdata as $row){
//连接字符串等同$content = $content.$row."\n"
$content .= $row."\n";
}
$content = trim($content,"\n");
//file_put_contents(),把一个字符串写入文件中
file_put_contents($succfile, $content);
//错误csv创建
$content = '';
$errfile = $path.$filename.'_err.'.$ext;
foreach($errdata as $row){
$content .= $row."\n";
}
$content = trim($content,"\n");
file_put_contents($errfile, $content);
//返回3个文件(用于查看失败列表与把成功的列表内容写入隐藏域中传递到数据库中)
return array(
'orginal' => $csvPath.$filename.'_org.'.$ext,
'success' => $csvPath.$filename.'_succ.'.$ext,
'error' => $csvPath.$filename.'_err.'.$ext
);
}
//删除文件
//获取csv文件的前缀名
public function rmMsgCsv($path){
//$prefix获取csv文件的前缀名
$prefix = str_replace('_succ.csv','',$path);
//删除三个文件
unlink($prefix.'_org.csv');
unlink($prefix.'_succ.csv');
unlink($prefix.'_err.csv');
}
public function mkdirs($dir, $mode = 0777) {
return is_dir($dir) or ($this->mkdirs(dirname($dir)) and mkdir($dir, $mode));
}
}