ThinkPHP上传文件时如何除去重复值

本文介绍了一种使用ThinkPHP框架实现CSV文件上传的方法,并详细解释了如何导入数据及检查数据重复性的过程。

上传文件时,首先要判断是不是 IS_GET()方式请求,然后实例化上传类,再设置上传的相关变量,最后判断文件是否上传,代码如下:

public function upload(){
        if(IS_GET){
            $this->display();
            exit;
        }
        $upload = new \Think\Upload();//实例化上传类
        $upload->maxSize = 3145728;//上传文件大小
        $upload->exts = array('csv');//设置附件上传类型
        $upload->rootPath = './Public/Uploads/';//设置附件上传根目录
        $upload->savePath = '';//设置附件上传子目录
        $info = $upload->upload();
        if (!$info) {
            $this->error($upload->getError());
        }else{
        $this->import($upload->rootPath . $info['file']['savepath'].$info['file']['savename']);
        }
    }

接下来,就是导入数据,并判断是否数据重复, 代码如下:

 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); 
            $arr = array();
            $filename = "./Public/Log/load.txt";
            $f = fopen($filename, 'w');
            
            while (($row = fgetcsv($fp,1000,","))!==false) {
            	$row = array_combine($fields, $row);
            	$name = $row['name'];
                $row['py']=SpGetPinyin($name);
                if (in_array($row['no'], $arrNo)) {
                   // echo $row['0']."已存在 . <br>";	
                	$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($f,$data);

            $file_name = "load.txt";     //下载文件名    
				$file_dir = "./Public/Log/";        //下载文件存放目录    
				//检查文件是否存在    
				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 ();    
				}    
            
   } 

### ThinkPHP8 中实现图片文件批量上传ThinkPHP8中,为了实现图片文件的批量上传功能,可以借鉴之前版本的经验并结合新的特性来完成这一操作。下面是一个详细的示例说明如何通过ThinkPHP8框架来进行多张图片的同上传。 #### 准备工作 确保服务器配置允许较大的文件大小以及足够的POST数据量: - `upload_max_filesize` 设置最大上传文件尺寸 - `post_max_size` 需要大于等于 `upload_max_filesize` - `memory_limit` 应该设置得更高以支持大文件处理[^3] 这些参数可以在php.ini文件里调整。 #### 控制器逻辑编写 创建一个新的控制器方法用于接收来自客户端提交的数据包,并对其进行解析和保存至指定位置。 ```php namespace app\controller; use think\Request; use think\File; public function uploadImages(Request $request){ // 获取多个文件对象数组 $files = $request->file('images'); foreach ($files as $key => $file) { // 判断是否有文件上传 if (empty($file)) continue; try{ // 自定义存储路径 $savePath = 'uploads/images/' . date("Ymd") . '/'; // 使用唯一ID作为文件名前缀防止复覆盖 $info = $file->validate([ 'ext'=>['jpg','jpeg','png'] ])->rule(function(){ return uniqid(); })->move(ROOT_PATH.'public/'.$savePath); if(!$info){ throw new \Exception($file->getError()); } // 返回成功信息给前端 echo "File {$key} uploaded successfully: ".str_replace("\\", "/", $info->getSaveName())."\n"; }catch (\Exception $e){ // 错误处理 echo "Error uploading file {$key}: ".$e->getMessage()."\n"; } } } ``` 此段代码实现了对传入请求中的每一个图像文件进行单独验证、命名并移动到应用程序公共目录下的特定子文件夹内。如果遇到任何错误,则会捕获异常并将消息返回给调用方。 #### 客户端HTML表单设计 为了让用户能够一次选择多个文件,在HTML页面上构建一个多选输入框是非常必要的。这里给出一个简单的例子展示怎样构造这样的界面元素。 ```html <form action="/index.php/index/uploadImages" method="post" enctype="multipart/form-data"> Select images to upload: <input type="file" name="images[]" multiple> <button type="submit">Upload</button> </form> ``` 上述表单允许用户选取一组图片并通过HTTP POST方式发送给服务器上的对应路由地址。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值