• 技术文章 >php教程 >PHP源码

    php上传cvs文件完整例子

    2016-06-08 17:22:10原创348
    下面给大家整理了个php上传cvs文件完整例子,希望此例子对各位同学会有所帮助自己没注意看不知道什么原因要上传csv文件哦。

    html代码:

    代码如下 复制代码




    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()函数
    echo "";
    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 ? ' 查看失败列表' : '';
    //成功的条数,失败的条数
    $('#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文件

    代码如下 复制代码

    //上传处理
    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").'//m.sbmmt.com/m/';
    $csvPath = "msgcsv/".date('Y').'//m.sbmmt.com/m/'.date('m')."//m.sbmmt.com/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));
    }
    }

    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
    专题推荐:nbsp quot content gt count
    上一篇:PHP中使用strtotime函数注意事项 下一篇:PHP清除指定html标签实例代码

    相关文章推荐

    • php学习笔记之面向对象编程• php给图片加水印六• php简单文件上传代码• php面向对象之工厂模式示例

    全部评论我要评论

  • 取消发布评论发送
  • 1/1

    PHP中文网