下面給大家整理了個php上傳cvs文件完整例子,希望此例子對各位同學會有所幫助自己沒注意看不知道什么原因要上傳csv文件.
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));
- }
- }
新聞熱點
疑難解答