1. 上传文件:在上传文件时,可使用TP自带的函数upload直接调用。设置附件上传的大小,类型,根目录,子目录的大小,然后实现上传,并将路径改为相对路径,不是绝对路径。
代码如下:
public function upload(){
if(IS_GET){
$this->display();
exit;
}
$upload=new \Think\Upload();//实例化上传类
$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']);
}
}
2.使用import方法,将上传的文件导入数据库中,并生成日志文件。
第一步:首先将文件读入一个字符串,将一个字符串写入文件,并用fopen打开文件。
第二步:使用fwrite写入日志文件。(注:写日志文件文件换行使用\r\n)。
第三步:使用in_array函数判断是否重复,如果重复,则提醒已存在,如果不重复,提醒导入成功。
代码如下:
public function import($file){
// $file="./Public/Upload/2018-03-21/5ab1b65184cc6.csv";
$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/load.txt";
$fop=fopen($filename,'w');
while(($row=fgetcsv($fp,1000,","))!==false){//从文件指针中读入一行并解析 CSV 字段
// $arr[]=array_combine($fields, $row);//创建一个数组,一个为键,一个为值
// dump($row);
// exit;
$row=array_combine($fields,$row);
// dump($row);
// exit;
$name=$row['name'];
$row['py']=SpGetPinyin($name);
// dump($row);
// exit;
if(in_array($row['no'], $arrNo)){
$data .= $row['no']."已存在\r\n";
}else{
$arr[]=$row;
$arrNo[]=$row['no'];
$data.= $row['no']."导入成功\r\n";
}
if(count($arr)==1000){
$model->addAll($arr);
unset($arr);//释放给定的变量
}
}
if(count($arr)>0){
$model->addAll($arr);
}
$this->show('添加成功','utf8');
}
$fwrite=fwrite($fop,$data);
$file_name = "load.txt"; //下载文件名
$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 );
// exit ();
}
}