-
php上传cvs文件完整例子
下面给大家整理了个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));
- }
- }
出处:http://www.phpfensi.com/php/20140619/3406.html
栏目列表
最新更新
nodejs爬虫
Python正则表达式完全指南
爬取豆瓣Top250图书数据
shp 地图文件批量添加字段
爬虫小试牛刀(爬取学校通知公告)
【python基础】函数-初识函数
【python基础】函数-返回值
HTTP请求:requests模块基础使用必知必会
Python初学者友好丨详解参数传递类型
如何有效管理爬虫流量?
SQL SERVER中递归
2个场景实例讲解GaussDB(DWS)基表统计信息估
常用的 SQL Server 关键字及其含义
动手分析SQL Server中的事务中使用的锁
openGauss内核分析:SQL by pass & 经典执行
一招教你如何高效批量导入与更新数据
天天写SQL,这些神奇的特性你知道吗?
openGauss内核分析:执行计划生成
[IM002]Navicat ODBC驱动器管理器 未发现数据
初入Sql Server 之 存储过程的简单使用
这是目前我见过最好的跨域解决方案!
减少回流与重绘
减少回流与重绘
如何使用KrpanoToolJS在浏览器切图
performance.now() 与 Date.now() 对比
一款纯 JS 实现的轻量化图片编辑器
关于开发 VS Code 插件遇到的 workbench.scm.
前端设计模式——观察者模式
前端设计模式——中介者模式
创建型-原型模式