php上傳cvs檔案完整例子

來源:互聯網
上載者:User

html代碼:

 代碼如下 複製代碼

<form action="/message/index/csv" encType="multipart/form-data" method="post" target="uploadcvs">
<div><input type="file" name="csvfile"/> &nbsp;<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));
    }
}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.