一、文件上传
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 ();
}
小结:这样我们就完成了文件的上传导入和下载的工作。避免重复是非常重要的,这一点必然是不可忽略的,需要仔细理解原理并加以实践,即可掌握。