关于文件上传(去重名)和文件下载

一、文件上传

thinkphp自带一个上传(upload)的类。首先我们需要先实例化这个类,再设置一些必要的参数,比如 $upload->maxSize = 0 ;// 设置附件上传大小, $upload->exts = array('csv');// 设置附件上传类型,$upload->rootPath = './Public/Upload/'; // 设置附件上传根目录,$upload->savePath = ''; // 设置附件上传(子)目录,然后上传文件即可

示例代码:

$upload = new \Think\Upload();
            $upload->maxSize = 0 ;// 设置附件上传大小
            $upload->exts = array('csv');// 设置附件上传类型
            $upload->rootPath = './Public/Upload/'; // 设置附件上传根目录
            $upload->savePath = ''; // 设置附件上传(子)目录
            // 上传文件

            $info = $upload->upload();
            

二、导入文件

这里我们需要自己写一个方法用来转换字符串的编码并判断

示例代码:

function detect_encoding($file){
	$list=array('GBK','UTF-8');
	$str=file_get_contents($file);
    foreach($list as $item){
    	$tmp = iconv($item, $item,$str);
    	if(md5($str)==md5($tmp)){
    		return $item;
    	}
    }
    return null;
}

导入文件时,为了避免重复导入我们需要进行去重的步骤

示例图:


示例代码:

$fp=fopen($file, 'r');//打开文件
        if($fp){
            $fields=array('no','name','sex');
            $model=M('student');
            $arrNo=$model->getField('no',true);
            // print_r($arrNo);
            $arr=array();
            $file  = './Public/Log/log.txt';//
            $fp2 = fopen($file, 'w');

            while (($row=fgetcsv($fp,1000,","))!==false){
                $row=array_combine($fields, $row);
                $ret=in_array($row['no'],$arrNo);

                if($ret==false){
                    $arrNo[]=$row['no'];
                    $arr[]=$row;
                    $content = "导入成功" . PHP_EOL;
                }else{
                    $content = $row['no']."已存在。" . PHP_EOL;                       
                }

                fwrite($fp2, $content);

                if(count($arr)==1000){
                    $model->addAll($arr);
                    unset($arr);
                  }
            }//while end
            fclose($fp2);

为了保证用户的体验,我们当然需要将成功或已存在的提示写入一个日志文件中,注重运行效率我使用了fopen,fwrite,fclose写日志文件。

三、下载文件

为了我们后台管理者能清楚地知道哪些已添加,哪些为新添加的,我们需要将日志文件下载到本地进行查看。将文件路径直接已参数传入即可

示例代码:

if (! file_exists ( $file )) {    
                echo "文件找不到";    
                exit ();    
            } else {    
                //打开文件    
                $fp = fopen ( $file, "r" );    
                //输入文件标签     
                Header ( "Content-type: application/octet-stream" );    
                Header ( "Accept-Ranges: bytes" );    
                Header ( "Accept-Length: " . filesize ( $file ) );    
                Header ( "Content-Disposition: attachment; filename=" . basename($file) );    
                //输出文件内容     
                //读取文件内容并直接输出到浏览器 
                echo fread ( $fp, filesize ( $file ) );    
                fclose ( $file );    
                exit ();    
            }    
小结:这样我们就完成了文件的上传导入和下载的工作。避免重复是非常重要的,这一点必然是不可忽略的,需要仔细理解原理并加以实践,即可掌握。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值