概述
导入文件时,有TP自带的函数upload可以直接调用,自已写入一个导入的方法,以便前台显示的调用,其中要考虑到文件的去重,和文件日志的下载,下面是我所学期间所做的项目的
首先设置文件上传的方法
//导入文件
public function upload(){
if(IS_GET){
$this->display();
exit;
}
$upload=new ThinkUpload();
$upload->maxSize=0;
$upload->exts = array('csv');// 设置附件上传类型
$upload->rootPath = './Public/Upload/'; // 设置附件上传根目录
$upload->savePath = ''; // 设置附件上传(子)目录
// 上传文件
$info = $upload->upload();
if(!$info) {// 上传错误提示错误信息
$this->error($upload->getError());
}else{// 上传成功
$this->import($upload->rootPath.$info['file']['savepath'].$info['file']['savename']);
}
}
然后对文件导入进行处理,也就是去除重复的记录,同时需要检测字符串的编码,还有自动生成拼音
//检测字符串的编码
//$file文件名
function detect_encoding($file) {
$list = array('GBK', 'UTF-8', 'UTF-16LE', 'UTF-16BE', 'ISO-8859-1');
$str = file_get_contents($file);
foreach ($list as $item) {
$tmp = mb_convert_encoding($str, $item, $item);
if (md5($tmp) == md5($str)) {
return $item;
}
}
return null;
}
// 应用公共文件
/**
* 获取拼音信息
*
* @access public
* @param string $str 字符串
* @param int $ishead 是否为首字母
* @param int $isclose 解析后是否释放资源
* @return string
*/
function SpGetPinyin($str, $ishead=0, $isclose=1)
{
// return dirname(__FILE__).'/pinyin.dat';
// exit;
global $pinyins;
$str = iconv('utf-8', 'gbk', $str);
//die ($str);
$restr = '';
$str = trim($str);
$slen = strlen($str);
if($slen < 2)
{
return $str;
}
if(count($pinyins) == 0)
{
$fp = fopen(dirname(__FILE__).'/pinyin.dat', 'r');
while(!feof($fp))
{
$line = trim(fgets($fp));
$pinyins[$line[0].$line[1]] = substr($line, 3, strlen($line)-3);
}
fclose($fp);
}
for($i=0; $i<$slen; $i++)
{
if(ord($str[$i])>0x80)
{
$c = $str[$i].$str[$i+1];
$i++;
if(isset($pinyins[$c]))
{
if($ishead==0)
{
$restr .= $pinyins[$c];
}
else
{
$restr .= $pinyins[$c][0];
}
}else
{
$restr .= "_";
}
}else if( preg_match("/[a-z0-9]/i", $str[$i]) )
{
$restr .= $str[$i];
}
else
{
$restr .= "_";
}
}
if($isclose==0)
{
unset($pinyins);
}
return $restr;
}
public function import($file){
$encoding=detect_encoding($file);
if($encoding!='UTF-8'){
$contens=file_get_contents($file);
$contens=mb_convert_encoding($contens,'utf-8',$encoding);
file_put_contents($file, $contens);
}
$fp=fopen($file, 'r');
if($fp){
$fields=array('no','name','sex');
$model=M('student');
$arrNo=$model->getField('no',true);//一维数组
// dump($arrNo);
// exit;
$arr=array();
$filename = './Public/Logs/demo.php' ;
$fop=fopen($filename, 'w');
while (($row=fgetcsv($fp,1000,","))!==false) {
// $arr[]=array_combine($fields, $row);
$row=array_combine($fields, $row);
$name=$row['name'];
$row['py']=SpGetPinyin($name);
// dump($row);
// exit;
if(in_array($row['no'], $arrNo)){
$data .= $row['no']."已存在rt";
$fwrite=fwrite($fop, $data);
// exit;
}else{
$arr[]=$row;//将数据放入到二维数组
$arrNo[]=$row['no'];//将数据放入数据库中
// exit;
// echo $row['no']."导入成功.<br>";
}
if(count($arr)==1000){
$model->addAll($arr);
unset($arr);
}
}
最后对已经处理过的进行写日志文件并将文件下载
//文件下载
$file_name = "demo.php";
$file_dir = "./Public/Logs/";
if(!file_exists($file_dir.$file_name)){
echo "文件找不到";
exit;
}else{
$file = fopen($file_dir.$file_name,"r");
Header("content-type:application/octet-stream");
Header("Accept-Ranges:bytes");
Header("Accept-Length:".filesize($file_dir.$file_name));
Header("Content-Disposition:attachment;filename=".$file_name);
echo fread($file,filesize($file_dir.$file_name));
fclose($file);
if(count($arr)>0){
$model->addAll($arr);
}
$this->show('添加成功','utf8');
}
}
最后
以上就是机智樱桃为你收集整理的thinkphp导入文件的全部内容,希望文章能够帮你解决thinkphp导入文件所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复