|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
不过语法好学,但是怎么用语法来实现每个人都有每个人的方式,几乎是各有千秋。然而借鉴别人成功的代码,绝对是有益无害,因此,多看那些经过千锤百炼凝出来的经典代码,是进阶的最好方法。自己因为想写个discuz插件,这个插件功效上触及到上传文件这一功效,故以菜鸟的目光来进修了下php上传文件。起首,w3cshool查了下案例,以为他说的十分具体,连我这个菜鸟都略懂了一二。贴上地点:http://www.w3school.com.cn/php/php_file_upload.asp照着这个解说,写了下他这个demo,贴上代码:html:<formaction="demo.php"method="post"enctype="multipart/form-data"><labelfor="file">Filename:</label><inputtype="file"name="file"id="file"><br/><inputtype="submit"name="submit"value="Submit"/></form>这个表单页,作为php菜鸟的我说下我在这个内里学到的新器材:1.form的属性enctype,百度翻译了下这个单词,才晓得,这个是encodetype的缩写,就是指定往服务器传送信息的编码格局;2.input的type属性file,这个公用文件上传的;php:复制代码//echophpinfo();//var_dump($_FILES);die;if((($_FILES["file"]["type"]=="image/gif")($_FILES["file"]["type"]=="image/jpeg")($_FILES["file"]["type"]=="image/pjpeg"))&&($_FILES["file"]["size"]<100*1024*1024)){if($_FILES["file"]["error"]>0){echo"Error:".$_FILES["file"]["error"]."<br/>";}else{echo"Upload:".$_FILES["file"]["name"]."<br/>";echo"Type:".$_FILES["file"]["type"]."<br/>";echo"Size:".($_FILES["file"]["size"]/1024)."Kb<br/>";echo"Storedin".$_FILES["file"]["tmp_name"];}if(file_exists("upload/".$_FILES["name"]["name"])){echo$_FILES["file"]["name"]."alreadyexists.";}else{move_uploaded_file($_FILES["file"]["tmp_name"],"upload/".$_FILES["file"]["name"]);echo"Storedin:"."upload/".$_FILES["file"]["name"];}}else{echo"Invalidfile";}复制代码关于调试这个demo的时分,我碰到一个成绩:就是运转这个demo的时分php报出warning,暗示上传不乐成。这个时分我就想打印出$_FILES这个变量来看看,了局打印出来发明error=1;才晓得上传的文件凌驾了php.ini的上传文件巨细,招致上传失利。这里说下俺新懂得的常识点: 复制代码 PHP编程言语中的罕见的$_FILES体系函数用法有: $_FILES[myFile][name]显现客户端文件的原称号。 $_FILES[myFile][type]文件的MIME范例,比方"image/gif"。 $_FILES[myFile][size]已上传文件的巨细,单元为字节。 $_FILES[myFile][tmp_name]贮存的一时文件名,通常为体系默许。 $_FILES[myFile][error]该文件上传相干的毛病代码。以下为分歧代码代表的意义: 0;文件上传乐成。 1;凌驾了文件巨细php.ini中即体系设定的巨细。 2;凌驾了文件巨细 MAX_FILE_SIZE选项指定的值。 3;文件只要部分被上传。 4;没有文件被上传。 5;上传文件巨细为0。复制代码到这里,应当就晓得了我方才运转demo的毛病是啥招致的,那既然发明是php.ini内里限定超越了,那接上去我就修正了下php.ini的设置。总结下我修正这个php.ini上传限定的感觉:起首,要修正php上传文件巨细限定,那要改php.ini内里的两个参数,一个是upload_max_filesize,另有个就是post_max_size,修正下这两个参数的巨细就能够了!其次,就是找准php.ini的地位,我因为当地电脑搭建的是集成情况,以是php.ini在apache文件夹上面,假如是本人搭建的情况,那就在php文件夹上面,假如找不到,echo下phpinfo(),能够看到php.ini文件的地位。那到此为止,跟我差未几的老手们就可以运转w3cshool下面的demo了,完成上传实例了。关于上传文件,我看了下discuz其他插件作者开辟的插件,有点小劳绩,贴下去跟人人分享下:复制代码 $fileTypes=array(mp3,wav);//界说同意上传的文件范例$result=null;$uploadDir=./mail;//上传路径if(!submitcheck($_POST[formhash2])){//检测是不是是上传文件if($_POST[upname]==){//判别上传文件的定名是不是为空$result=lang(plugin/saya_mails,noname);}else{$myfile=$_FILES[myfile];//猎取上传的文件信息$myfileType=substr($myfile[name],strrpos($myfile[name],".")+1);//两种猎取上传文件的后缀名//$myfileTyle=substr(strrchr($myfile[name],.),1);if($myfile[size]>1024*1024*1024){//判别上传文件巨细是不是凌驾限定$result=lang(plugin/saya_mails,big);}elseif(!in_array($myfileType,$fileTypes)){//判别是不是是同意上传的范例$result=lang(plugin/saya_mails,type);}elseif(is_uploaded_file($myfile[tmp_name])){//判别是不是是经由过程HTTPpost上传的文件$toFile=./source/plugin/saya_mails/mail/.$myfile[name];//方针存储地点if(@move_uploaded_file($myfile[tmp_name],$toFile)){//将文件拷贝到方针存储地点//这个中央加@是屏障毛病信息和告诫//if(copy($myfile[tmp_name],$toFile)){$end=0;$result=lang(plugin/saya_mails,success); }else{$result=lang(plugin/saya_mails,unknow);}}else{$result=lang(plugin/saya_mails,big);} } }复制代码对照了下,w3cshool下面的上传实例,以为这个作者写的更完美一点大致流程就是: 1.判别是不是是上传文件,他用的这个办法是discuz自带的,我们一样平常用,就是form传送过去的埋没参数的值存不存在来举行判别; 2.判别上传文件的定名是不是为空,这一步人人能够跳过,这个是他本人写了个input罢了; 3.判别上传巨细是不是超越; 4.猎取文件后缀名,判别是不是是同意的上传文件范例; 5.判别文件是不是是经由过程httppost上传的; 6.挪动保留文件;关于以下流程,团体总结了下本人取得的新的常识点: 1.关于猎取文件的后缀名,原插件作者是经由过程函数strrpos()来前往"."地点的地位,然后经由过程截取函数substr()来取得上传文件的后缀。 这里,strrpos()函数,我本人的了解应当是stringreturnposition的缩写,固然我还没查证过!这个函数是前往字符串里要查找的字符串最初呈现的地位,并前往这个地位。也就是从后往前查,第一次呈现的地位。参考地点:http://www.w3school.com.cn/php/func_string_strrpos.asp 这里原作者用这个办法来判别,一定是能够的,我百度了下,发明也能够用strrchr()和substr()函数互助来完成这个办法,我把我想的办法正文在了下面源代码内里了,实在差未几,strrchr()函数就是前往最初一次呈现的要查找的字符串到开头的字符串,参考地点:http://www.w3school.com.cn/php/func_string_strrchr.asp 经由过程以上两种办法来判别上传文件的范例是不是达标,而不是经由过程$_FILES["file"]["type"]来判别,如许更好判别点,关于老手,由于只需你打印下$_FILES这个参数你就晓得了,type属性没这么判别来的明晰了然。 2.经由过程is_uploaded_file()来判别文件是不是是经由过程http上传的 3.move_uploaded_file()后面的@是用来屏障毛病信息和告诫的学习数据库了,MYSQL可算是PHP的黄金搭档了,不过,虽然话是这么说,你也可能恨不得把MYSQL给生吞活剥了,因为这一行一列的东东简直让自己头晕目眩。 |
|