浅析tp3的文件上传

本文介绍了一个在ThinkPHP3(简称tp3)框架下处理文件上传,并在导入CSV数据时进行重复学号验证的方法。首先,查询数据库中的学号存储到数组,然后遍历上传文件中的学号,若学号已存在于数据库则提示,否则添加到数组并导入数据库。同时,提供了文件下载的示例代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    在项目中,经常存在大批量像数据中导入信息,但在导入过程中难免存在文件中有重复信息,出现重复导入问题,这就需要我们在后台实现验证。
     我的个人思路:
         1.查询数据库中的学号,将这些学号存在arrNo数组;
         2.创建空数组;
         3.跳入到上传文件的while循环中。判断学号是否在数组中存在,存在则给出提示,该学号已存在;若学号在数组中不存在。追加到存学号的数组中,然后进一步追加到空数组中,然后导入到数据库;
     示例代码:
      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();
            
            // dump($info['file']['savepath'].$info['file']['savename']);
            if(!$info) {// 上传错误提示错误信息
            $this->error($upload->getError());
            }else{// 上传成功
            // $this->success('上传成功');
                // dump($upload->rootPath.$info['file']['savepath'].$info['file']['savename']);
            $this->import($upload->rootPath.$info['file']['savepath'].$info['file']['savename']);
            }
    }
    
    public function import($file){
        // $file = './Public/Upload/2018-03-21/5ab1cb8946cea.csv';
        $encoding = detect_encoding($file);
        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);
            // print_r($arrNo);
            $arr=array();
            $file  = './Public/Log/log.txt';//
            $fp2 = 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'];
                    $arr[]=$row;
                    $content = "导入成功" . PHP_EOL;                      
                }


                fwrite($fp2, $content);


                if(count($arr)==1000){
                    $model->addAll($arr);
                    unset($arr);
                  }
            }//while end


            fclose($fp2);


            if(count($arr)>0){
                $model->addAll($arr);
            }


            $this->up($file);


    }
}




    文件下载的示例代码:
   public function up($file){ 
            // $file_name = "log.txt";     //下载文件名    
            // $file_dir = "./Public/Log/";        //下载文件存放目录    
            //检查文件是否存在    
            if (! file_exists ( $file )) {    
                echo "文件找不到";    
                exit ();    
            } else {    
                //打开文件    
                $fp = fopen ( $file, "r" );    
                //输入文件标签     
                Header ( "Content-type: application/octet-stream" );    
                Header ( "Accept-Ranges: bytes" );    
                Header ( "Accept-Length: " . filesize ( $file ) );    
                Header ( "Content-Disposition: attachment; filename=" . basename($file) );    
                //输出文件内容     
                //读取文件内容并直接输出到浏览器 
                echo fread ( $fp, filesize ( $file ) );    
                fclose ( $file );    
                exit ();    
            }    
        }
STM32启动文件是嵌入式开发中非常关键的一部分,它负责在芯片上电或复位后进行初始设置,并跳转到主程序的入口点。该文件通常以汇编语言编写,其功能包括初始化堆栈指针、中断向量表配置、系统时钟设置以及调用C库函数的初始化代码等。 ### 启动文件的主要功能 1. **设置初始堆栈指针** 在芯片上电后,首先需要设置堆栈指针(SP),这是因为在后续的初始化和程序运行过程中会使用到堆栈来保存局部变量、函数调用返回地址等信息。启动文件通过一条指令将一个预定义的地址赋值给堆栈指针寄存器。 2. **定义中断向量表** STM32微控制器支持多种中断源,因此启动文件必须定义中断向量表,其中包括各种异常处理程序和外设中断服务例程的入口地址。例如,复位中断(Reset_Handler)是第一个被执行的处理程序,它负责引导整个系统的初始化过程[^1]。 3. **调用系统初始化函数** 复位处理程序通常会调用`SystemInit()`函数,这个函数用于配置系统时钟(如PLL设置)、AHB/APB总线时钟分频系数等关键参数,确保MCU运行在正确的频率下。 4. **跳转到主程序入口(main函数)** 完成底层硬件初始化之后,启动文件中的代码会调用`main()`函数,从而进入用户应用程序的执行阶段。在此之前,可能还会涉及到`.data`段和`.bss`段的初始化,即把已初始化的数据从Flash复制到RAM中,并将未初始化的数据区域清零[^1]。 5. **提供默认的中断处理程序** 如果某些中断没有被用户显式地实现,则启动文件可以提供一些弱定义(weak symbols)的默认处理程序,防止程序因找不到中断服务例程而崩溃。 6. **支持调试接口配置** 有些启动文件还包含对调试接口(如SWD或JTAG)的支持,以便于开发者进行在线调试。 ### 启动文件的基本结构示例 以下是一个简化的STM32启动文件片段,展示了基本的中断向量表和复位处理程序: ```assembly ; 文件名:startup_stm32f10x_hd.s .section .isr_vector,"a",%progbits .type g_pfnVectors, %object .size g_pfnVectors, .-g_pfnVectors g_pfnVectors: .word _estack ; Initial Stack Pointer .word Reset_Handler ; Reset Handler .word NMI_Handler ; NMI Handler .word HardFault_Handler ; Hard Fault Handler .word MemManage_Handler ; MPU Fault Handler ... .thumb_func .type Reset_Handler, %function Reset_Handler: bl SystemInit ; Call SystemInit before main ldr r0, =_start ; Set the initial PC to main bx r0 ; Branch to main ``` 在这个例子中,`_estack`表示堆栈的起始地址,而`Reset_Handler`则是复位中断的处理程序,它调用了`SystemInit()`并最终跳转到`main()`函数开始执行用户代码。 ### 相关问题 1. STM32启动文件如何影响系统的时钟配置? 2. 如何修改STM32的启动文件以适应不同的硬件平台? 3. 在STM32项目中,为什么需要对.data和.bss段进行初始化? 4. 不同系列的STM32芯片之间启动文件有何差异? 5. 调试STM32应用时,启动文件中的哪些部分可能会导致问题?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值