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

效果:


推荐阅读
  • 开发笔记:UEditor调用上传图片上传文件等模块
    1、引入ue相关文件,写好初始代码为了更好的封装整一个单独的插件,这里我们要做到示例化ue后隐藏网页中的编辑窗口,并移除焦点。 ... [详细]
  • 原文转自:http:blog.csdn.netchinasoftosgarticledetails7903045UploadAction.java:packagecr ... [详细]
  • UEditor可以如何直接复制word的图文内容到编辑器中
    这种方法是servlet,编写好在web.xml里配置servlet-class和servlet-mapping即可使用后台(服务端)j ... [详细]
  • 这是原文链接:sendingformdata许多情况下,我们使用表单发送数据到服务器。服务器处理数据并返回响应给用户。这看起来很简单,但是 ... [详细]
  • 本文介绍了南邮ctf-web的writeup,包括签到题和md5 collision。在CTF比赛和渗透测试中,可以通过查看源代码、代码注释、页面隐藏元素、超链接和HTTP响应头部来寻找flag或提示信息。利用PHP弱类型,可以发现md5('QNKCDZO')='0e830400451993494058024219903391'和md5('240610708')='0e462097431906509019562988736854'。 ... [详细]
  • 基于Socket的多个客户端之间的聊天功能实现方法
    本文介绍了基于Socket的多个客户端之间实现聊天功能的方法,包括服务器端的实现和客户端的实现。服务器端通过每个用户的输出流向特定用户发送消息,而客户端通过输入流接收消息。同时,还介绍了相关的实体类和Socket的基本概念。 ... [详细]
  • 图像因存在错误而无法显示 ... [详细]
  • 如何在HTML中获取鼠标的当前位置
    本文介绍了在HTML中获取鼠标当前位置的三种方法,分别是相对于屏幕的位置、相对于窗口的位置以及考虑了页面滚动因素的位置。通过这些方法可以准确获取鼠标的坐标信息。 ... [详细]
  • JavaScript和HTML之间的交互是经由过程事宜完成的。事宜:文档或浏览器窗口中发作的一些特定的交互霎时。能够运用侦听器(或处置惩罚递次来预订事宜),以便事宜发作时实行相应的 ... [详细]
  • 本文介绍了使用FormData对象上传文件同时附带其他参数的方法。通过创建一个表单,将文件和参数添加到FormData对象中,然后使用ajax发送POST请求进行文件上传。在发送请求时,需要设置processData为false,告诉jquery不要处理发送的数据;同时设置contentType为false,告诉jquery不要设置content-Type请求头。 ... [详细]
  • android 触屏处理流程,android触摸事件处理流程 ? FOOKWOOD「建议收藏」
    android触屏处理流程,android触摸事件处理流程?FOOKWOOD「建议收藏」最近在工作中,经常需要处理触摸事件,但是有时候会出现一些奇怪的bug,比如有时候会检测不到A ... [详细]
  • 用ESP32与Python实现物联网(IoT)火焰检测报警系统
    下图是本案例除硬件连线外的3步导学开发过程,每个步骤中实现的功能请参考图中的说明。在硬件连线完成之后我们建议您先使用“一分钟上云体验”功能预先体验本案例的实际运行效果 ... [详细]
  • Java大文件HTTP断点续传到服务器该怎么做?
    最近由于笔者所在的研发集团产品需要,需要支持高性能的大文件http上传,并且要求支持http断点续传。这里在简要归纳一下,方便记忆 ... [详细]
  • 前景:当UI一个查询条件为多项选择,或录入多个条件的时候,比如查询所有名称里面包含以下动态条件,需要模糊查询里面每一项时比如是这样一个数组条件:newstring[]{兴业银行, ... [详细]
  • 本文介绍了一个题目的解法,通过二分答案来解决问题,但困难在于如何进行检查。文章提供了一种逃逸方式,通过移动最慢的宿管来锁门时跑到更居中的位置,从而使所有合格的寝室都居中。文章还提到可以分开判断两边的情况,并使用前缀和的方式来求出在任意时刻能够到达宿管即将锁门的寝室的人数。最后,文章提到可以改成O(n)的直接枚举来解决问题。 ... [详细]
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社区 版权所有