热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

ThinkPHP导入文件并上传与文件下载

在做网站项目时必不可少就是导入文件将数据传进数据表中,并将插入数据写入日志文件并下载。下面是我的代码与心得。第一步:给表单中的input添加一个name属性为file,action设置为当前

在做网站项目时必不可少就是导入文件将数据传进数据表中,并将插入数据写入日志文件并下载。下面是我的代码与心得。

第一步:给表单中的input添加一个name属性为file,action设置为当前控制器下的upload方法,特别注意:一定要在表单中写入enctype="multipart/form-data

	
	

第二步:在当前控制器下新建upload方法,先判断是否为post方式提交,如果不是则退出;设置上传文件的属性如大小、后缀、根目录等,调用Think模块的Upload方法,上传文件,失败则提示。最后调用import方法,并将文件路径作为参数传递过去。

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->success('上传成功!' . $info['file']['savepath'] . $info['file']['savename']);
		$file = './Public/upload/' . $info['file']['savepath'] . $info['file']['savename'];//文件的完整路径
		$this->import($file);//调用import方法
	}
}

第三步:先检测文件编码是否为utf8格式(检测编码格式的函数将在下文展示),因为学号为主键不能重复,所以要检测导入文件中的学号是否已经存在,要将数据表中的学号提出来放到一个数组中,再将文件里的学号插入到数组中,无论是否存在都将信息写入到日志文件中,并下载。

public function import($file){
    //检测文件编码
    $encoding=detect_encoding($file);
    //如果不是utf8格式,则转化为utf8
    if($encoding !='UTF-8'){
    	$cOntents=file_get_contents($file);
    	$cOntents=mb_convert_encoding($contents, 'utf-8',$encoding);
    	file_put_contents($file, $contents);
    }
    $fp=fopen($file,'r');
		if($fp){
			$fields=array('no','name','sex');
			$model=M('student');
			$arrno=$model->getField('no',true);
			// dump($arrno);
			// exit;
			$arr=array();
            $file = 'log.txt';
			$file = fopen($file, 'w');
			while(($row=fgetcsv($fp,1000,","))!==false){
				$row=array_combine($fields, $row);
				if(in_array($row['no'],$arrno)){
				  $cOntent= $row['no'] . "已存在" . PHP_EOL;
				}else{
                   $arrno[] = $row['no'];
                   $name = $row['name'];
                   $py = SpGetPinyin($name);
					   $row['py'] = $py;
					   $password = '123456';
					   $row['password'] = md5($password);
					   $create_time = intval(time());
					   $row['create_time'] = $create_time;
                   $arr[] = $row;
                   $cOntent= $row['no'] . "导入成功" .PHP_EOL;
				}
                fwrite($file, $content);
				// dump($row);
				if(count($arr) == 1000){
					$model->addAll($arr);
					unset($arr);
				}
			}
			fclose($file);
			if(count($arr)>0){
				$model->addAll($arr);
			}
			// $this->success('添加成功');
			$this->download();
		}
}
第五步:先定义要下载的文件名称和存放目录,使用file_exists()函数检测文件是否存在,使用header设置各种属性用来显示都爱浏览器中即可完成
// 文件下载
protected function download(){
	$file_name = "log.txt";     //下载文件名    
	$file_dir = ROOT . "/";   //下载文件存放目录  
	echo $file_dir . $file_name;
	//检查文件是否存在    
	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 ();    
	}     
}

效果:


推荐阅读
  • 本文详细介绍如何使用Python进行配置文件的读写操作,涵盖常见的配置文件格式(如INI、JSON、TOML和YAML),并提供具体的代码示例。 ... [详细]
  • 解决Element UI中Select组件创建条目为空时报错的问题
    本文介绍如何在Element UI的Select组件中使用allow-create属性创建新条目,并处理创建条目为空时出现的错误。我们将详细说明filterable属性的必要性,以及default-first-option属性的作用。 ... [详细]
  • PostgreSQL 10 离线安装指南
    本文详细介绍了如何在无法联网的服务器上进行 PostgreSQL 10 的离线安装,并涵盖了从下载安装包到配置远程访问的完整步骤。 ... [详细]
  • Linux 系统启动故障排除指南:MBR 和 GRUB 问题
    本文详细介绍了 Linux 系统启动过程中常见的 MBR 扇区和 GRUB 引导程序故障及其解决方案,涵盖从备份、模拟故障到恢复的具体步骤。 ... [详细]
  • This guide provides a comprehensive step-by-step approach to successfully installing the MongoDB PHP driver on XAMPP for macOS, ensuring a smooth and efficient setup process. ... [详细]
  • 本文详细介绍了 Dockerfile 的编写方法及其在网络配置中的应用,涵盖基础指令、镜像构建与发布流程,并深入探讨了 Docker 的默认网络、容器互联及自定义网络的实现。 ... [详细]
  • 本文介绍了一款用于自动化部署 Linux 服务的 Bash 脚本。该脚本不仅涵盖了基本的文件复制和目录创建,还处理了系统服务的配置和启动,确保在多种 Linux 发行版上都能顺利运行。 ... [详细]
  • 本文详细介绍了Akka中的BackoffSupervisor机制,探讨其在处理持久化失败和Actor重启时的应用。通过具体示例,展示了如何配置和使用BackoffSupervisor以实现更细粒度的异常处理。 ... [详细]
  • 网络攻防实战:从HTTP到HTTPS的演变
    本文通过一系列日记记录了从发现漏洞到逐步加强安全措施的过程,探讨了如何应对网络攻击并最终实现全面的安全防护。 ... [详细]
  • 网络运维工程师负责确保企业IT基础设施的稳定运行,保障业务连续性和数据安全。他们需要具备多种技能,包括搭建和维护网络环境、监控系统性能、处理突发事件等。本文将探讨网络运维工程师的职业前景及其平均薪酬水平。 ... [详细]
  • 高效解决应用崩溃问题!友盟新版错误分析工具全面升级
    友盟推出的最新版错误分析工具,专为移动开发者设计,提供强大的Crash收集与分析功能。该工具能够实时监控App运行状态,快速发现并修复错误,显著提升应用的稳定性和用户体验。 ... [详细]
  • andr ... [详细]
  • 本文介绍如何在现有网络中部署基于Linux系统的透明防火墙(网桥模式),以实现灵活的时间段控制、流量限制等功能。通过详细的步骤和配置说明,确保内部网络的安全性和稳定性。 ... [详细]
  • 通过Web界面管理Linux日志的解决方案
    本指南介绍了一种利用rsyslog、MariaDB和LogAnalyzer搭建集中式日志管理平台的方法,使用户可以通过Web界面查看和分析Linux系统的日志记录。此方案不仅适用于服务器环境,还提供了详细的步骤来确保系统的稳定性和安全性。 ... [详细]
  • 在Linux系统中配置并启动ActiveMQ
    本文详细介绍了如何在Linux环境中安装和配置ActiveMQ,包括端口开放及防火墙设置。通过本文,您可以掌握完整的ActiveMQ部署流程,确保其在网络环境中正常运行。 ... [详细]
author-avatar
雨舒紫_586
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有