热门标签 | 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 ();    
	}     
}

效果:


推荐阅读
  • 本文详细介绍了如何在Oracle VM VirtualBox中实现主机与虚拟机之间的数据交换,包括安装Guest Additions增强功能,以及如何利用这些功能进行文件传输、屏幕调整等操作。 ... [详细]
  • 问题描述现在,不管开发一个多大的系统(至少我现在的部门是这样的),都会带一个日志功能;在实际开发过程中 ... [详细]
  • Requests库的基本使用方法
    本文介绍了Python中Requests库的基础用法,包括如何安装、GET和POST请求的实现、如何处理Cookies和Headers,以及如何解析JSON响应。相比urllib库,Requests库提供了更为简洁高效的接口来处理HTTP请求。 ... [详细]
  • 解决PHP项目在服务器无法抓取远程网页内容的问题
    本文探讨了在使用PHP进行后端开发时,遇到的一个常见问题:即在本地环境中能够正常通过CURL获取远程网页内容,但在服务器上却无法实现。我们将分析可能的原因并提供解决方案。 ... [详细]
  • spring boot使用jetty无法启动 ... [详细]
  • 本文将从基础概念入手,详细探讨SpringMVC框架中DispatcherServlet如何通过HandlerMapping进行请求分发,以及其背后的源码实现细节。 ... [详细]
  • 深入理解:AJAX学习指南
    本文详细探讨了AJAX的基本概念、工作原理及其在现代Web开发中的应用,旨在为初学者提供全面的学习资料。 ... [详细]
  • PHP面试题精选及答案解析
    本文精选了新浪PHP笔试题及最新的PHP面试题,并提供了详细的答案解析,帮助求职者更好地准备PHP相关的面试。 ... [详细]
  • 本文详细探讨了在Java中如何将图像对象转换为文件和字节数组(Byte[])的技术。虽然网络上存在大量相关资料,但实际操作时仍需注意细节。本文通过使用JMSL 4.0库中的图表对象作为示例,提供了一种实用的方法。 ... [详细]
  • 本文介绍了.hbs文件作为Ember.js项目中的视图层,类似于HTML文件的功能,并详细讲解了如何在Ember.js应用中集成Bootstrap框架及其相关组件的方法。 ... [详细]
  • protobuf 使用心得:解析与编码陷阱
    本文记录了一次在广告系统中使用protobuf进行数据交换时遇到的问题及其解决过程。通过这次经历,我们将探讨protobuf的特性和编码机制,帮助开发者避免类似的陷阱。 ... [详细]
  • 本文探讨了在Windows系统中运行Apache服务器时频繁出现崩溃的问题,并提供了多种可能的解决方案和建议。错误日志显示多个子进程因达到最大请求限制而退出。 ... [详细]
  • 本文详细介绍了如何在Apache Kafka中进行Topic级别的配置,包括创建、修改和删除配置参数的具体步骤,并提供了详细的配置属性表。 ... [详细]
  • 本文介绍了如何在不同操作系统上安装Git,以及一些基本和高级的Git操作,包括项目初始化、文件状态检查、版本控制、分支管理、标签处理、版本回退等,并简要提及了开源许可协议的选择。 ... [详细]
  • 在尝试启动Java应用服务器Tomcat时,遇到了org.apache.catalina.LifecycleException异常。本文详细记录了异常的具体表现形式,并提供了有效的解决方案。 ... [详细]
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社区 版权所有