php文件上传(详细方法)
- 格式:pdf
- 大小:84.88 KB
- 文档页数:7
PHP使用curl模拟post上传及接收文件的方法在PHP中,我们可以使用curl库来模拟POST请求进行文件的上传和接收。
Curl是一个功能强大的跨平台开放源代码网络传输工具,它支持多种网络协议,其中就包括HTTP/HTTPS协议。
下面是一种使用curl模拟POST上传文件的方法:1. 建立一个curl会话。
```php$ch = curl_init(;```2. 设置curl选项,包括URL、请求方法、请求头和请求体等。
```php$postData = arraycurl_setopt($ch, CURLOPT_POST, true); // 使用POST请求curl_setopt($ch, CURLOPT_POSTFIELDS, $postData); // 请求体数据curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // 返回响应结果```3. 执行curl请求并获取响应结果。
```php$response = curl_exec($ch);```4. 关闭curl会话。
```phpcurl_close($ch);```注意事项:- 如果上传的文件需要使用其他请求参数一起提交,可以将额外的参数添加到$postData数组中。
- 在执行curl请求之前,可以通过curl_setopt设置其他一些选项,如请求超时时间、请求头信息等。
在服务端接收文件时,可以使用$_FILES全局变量来获取上传的文件信息。
例如,接收一个名为file的文件上传:```php$uploadedFile = $_FILES['file'];```可以通过$uploadedFile变量来访问文件的一些属性,如文件名、临时文件路径、文件大小等。
下面是一些常用的属性:- $uploadedFile['name']:获取上传文件的名称。
- $uploadedFile['tmp_name']:获取上传文件的临时文件路径,用于读取临时文件的内容。
文件上传的简单方法文件上传是指将本地计算机上的一个或多个文件上传到服务器。
在网站或应用程序开发中,文件上传是一个常见的功能需求。
本文将介绍文件上传的简单方法,包括前端和后端的实现。
前端文件上传方法:1.使用原生HTML表单:2. 使用Ajax:可以使用JavaScript中的XMLHttpRequest或Fetch API来实现文件的异步上传。
这种方法对用户体验更好,因为用户无需离开当前页面。
后端文件上传方法:1.使用服务器端脚本处理上传文件:大部分服务器端语言都提供了处理文件上传的库或模块。
例如,PHP 中的move_uploaded_file(函数可以将临时存储位置的文件移动到指定位置。
2.使用专门的文件上传中间件/插件:很多后端框架都提供了文件上传的中间件或插件,可以简化文件上传的操作。
例如,Node.js的Express框架提供了multer中间件来处理文件上传。
文件上传功能存在一定的安全风险,可能会被滥用或攻击。
以下是一些增加文件上传安全性的措施:1.限制文件类型和大小:检查上传文件的类型和大小,并只允许合法的文件类型和大小上传。
可以通过后缀名、MIME类型或文件头部来检测文件类型。
还可以设置最大文件大小限制。
2.存储位置和权限:将上传的文件存储在安全的位置,并配置适当的权限,以防止未授权的访问。
最好将上传文件存储在非可执行目录下。
3.随机文件名和避免覆盖文件:为了防止文件名冲突和覆盖现有文件,可以将上传文件的文件名修改为唯一的随机值,并保存文件原始的扩展名。
4.文件验证:对上传的文件进行验证,以确保文件的完整性和安全性。
例如,可以检测文件的预期类型和结构,避免包含恶意代码或脚本。
5.安全配置:服务器和应用程序的安全配置也非常重要,包括防火墙、安全证书、访问控制等。
综上所述,文件上传是一个常见的功能需求,可以通过前端和后端的方法实现。
为了提高文件上传的安全性,应采取适当的措施限制文件类型和大小、存储位置和权限、随机文件名、文件验证等,并配置服务器和应用程序的安全措施。
functionuploadfile($type,$name,$ext,$size,$error,$tmp_name,$targetname,$upload_ dir){$MAX_SIZE = 2000000;$FILE_MIMES =array('image/pjpeg','image/jpeg','image/jpg','image/gif','image/png','image/x -png');$FILE_EXTS = array('.jpg','.gif','.png','.JPG','.GIF','.PNG');$file_path = $upload_dir.$targetname;if(!is_dir($upload_dir)){if(!mkdir($upload_dir))die("文件上传目录不存在并且无法创建文件上传目录");if(!chmod($upload_dir,0755))die("文件上传目录的权限无法设定为可读可写");}if($size>$MAX_SIZE)die("上传的文件大小超过了规定大小");if($size == 0)die("请选择上传的文件");if(!in_array($type,$FILE_MIMES) || !in_array($ext,$FILE_EXTS))die("请上传符合要求的文件类型");if(!move_uploaded_file($tmp_name, $file_p ath))die("复制文件失败,请重新上传");switch($error){case 0:echo "图片上传成功...<br/>";echo "3秒钟后自动跳转...如果没有跳转,<a href='uploadFile.php'>请点击这里</a>";return ;case 1:die("上传的文件超过了php.ini 中upload_max_files ize选项限制的值");case 2:die("上传文件的大小超过了HTML 表单中MAX_FILE_SIZE 选项指定的值");case 3:die("文件只有部分被上传");case 4:die("没有文件被上传");}}似乎PHP没有自带获取文件后缀名的函数,翻书也没找到,网上搜索也没有,就自己写了个函数,很轻松就可以获取了。
⽂件上传的⼏种⽅法当我们想把⽂件上传到web服务器上时,通常有如下⼏种⽅法:⽅法1、html(form)+nginx(⽂件上传模块)+php:这种⽅式最复杂。
⼀般不⽤。
实现过程说明如下:步骤⼀:form中,action=“/upload”. 指定⼀个⽬录,⽽不是⼀个⽂件。
method都是POST.步骤⼆:在nginx中,安装⽂件上传模块进⾏编译安装。
然后配置⽂件中,对/upload访问⽬录进⾏配置。
指定相关参数。
并指定后端处理⽂件上传的php⽂件。
经过nginx转⼿,后端php获取的参数就是nginx传递的,不是前端form过来的。
步骤三:后端php⽂件对传递过来的⽂件信息进⾏处理。
需要配置php.ini,允许上传⽂件。
以上实现的⽅法,在之前的html备份⽂件中存在。
可以找到(html201908221746)。
nginx的备份⽂件:nginx.conf201908242138。
⽅法2、html(form)+nginx+php:这种⽅式常见,配置⽐较简单。
步骤⼀:form中,action=“/test.php”. 指定后端php⽂件,method都是POST.步骤⼆:nginx只做为web服务存在步骤三:php.ini中启⽤⽂件上传,指定⽂件临时存储路径等等。
步骤四:php⽂件处理前端传递过来的上传⽂件。
⽐如:html:<form enctype="multipart/form-data" action="test.php" method="post">选择⽂件:<input type="file" name="file" > <br><input type="submit" value="上传">php:$uploaddir = '/tmp/test/' ;$uploadfile = $uploaddir.basename ( $_FILES [ 'file' ][ 'name' ]);if ( move_uploaded_file ( $_FILES [ 'file' ][ 'tmp_name' ], $uploadfile )) {echo "File is valid, and was successfully uploaded.\n" ;} else {echo "Possible file upload attack!\n" ;}echo 'Here is some more debugging info:' ;注意:curl的file关键字和php中的$_FILES [ 'file' ][ 'tmp_name' ]中的file关键字对应。
用php实现文件上传二法--------------------------------------------------------------------------------PHP(Hypertext Preprocessor)是一种HTML 内嵌式的语言(类似IIS 上的ASP)。
而PHP 独特的语法混合了C、Java、Perl 以及PHP 式的新语法。
它可以比CGI 或者Perl 更快速的执行动态网页。
除此之外,用PHP 写出来的Web 后端CGI 程序,可以很轻易的移植到不同的系统平台上。
我们在做网站时,需要访问者的参于才能将网站建设得更加引人注目,这就要求我们从访问者那里得到文章、图片等。
因此,文件上传成为网页中必不可少的功能。
现在我就利用现在流行的编程语言PHP,用两种方法来说明其功能的实现。
一、利用php的文件函数来实现上传这段代码分为两个文件,一个为upload.html,一个是upload.php。
上传文件选择:upload.html 代码如下:--------------------------------------------------------------------------------<html> <head> <title> 上载文件表单</title> </head><body><form enctype=\ "multipart/form-data\ " action=\ "upload.php\ " method=\ "post\ "><input type=\ "hidden\ " name=\ "max_file_size\ " value=\ "100000\ "><center> 请选择文件:<input name=\ "userfile\ " type=\ "file\ "><input type=\ "submit\ " value=\ "上传文件\ "></center></form></body></html>--------------------------------------------------------------------------------*** 说明***1、请注意<form enctype=\ "multipart/form-data\ "......> 这是一个标签,我们要实现文件的上传,必须指定为multipart/form-data ,否则服务器将不知道你在干什么!2、值得注意的是文件upload.html中表单选项MAX_FILE_SIZE 的隐藏值域,通过设置其Value(值)可以限制上载文件的大小。
⼀个完整的php上传功能完整代码(upload代码)创建⼀个⽂件上传表单允许⽤户从表单上传⽂件是⾮常有⽤的。
创建上传脚本"upload_file.php" ⽂件含有供上传⽂件的代码:<?phpif ($_FILES["file"]["error"] > 0){echo "错误:" . $_FILES["file"]["error"] . "<br>";}else{echo "上传⽂件名: " . $_FILES["file"]["name"] . "<br>";echo "⽂件类型: " . $_FILES["file"]["type"] . "<br>";echo "⽂件⼤⼩: " . ($_FILES["file"]["size"] / 1024) . " kB<br>";echo "⽂件临时存储的位置: " . $_FILES["file"]["tmp_name"];}?>通过使⽤ PHP 的全局数组 $_FILES,你可以从客户计算机向远程服务器上传⽂件。
第⼀个参数是表单的 input name,第⼆个下标可以是 "name"、"type"、"size"、"tmp_name" 或 "error"。
FileUpload(⽂件上传)⼀句话⽊马<?php@eval($_POST['key']);>/*eval(phpcode)eval() 函数把字符串按照 PHP 代码来计算。
该字符串必须是合法的 PHP 代码,且必须以分号结尾。
*/通常是由于对上传⽂件的类型、内容没有进⾏严格的过滤、检查,使得攻击者可以通过上传⽊马获取服务器的webshell权限,因此⽂件上传漏洞带来的危害常常是毁灭性的,Apache、Tomcat、Nginx等都曝出过⽂件上传漏洞。
Lowbasename(path,suffix)函数返回路径中的⽂件名部分,如果可选参数suffix为空,则返回的⽂件名包含后缀名,反之不包含后缀名。
我们看到服务器对上传的⽂件类型、内容或是⽂件⼤⼩都没有做任何的检查、过滤,存在明显的⽂件上传漏洞,⽣成上传路径后,服务器会检查是否上传成功并返回相应提⽰信息。
这段代码的核⼼就是验证是否有接收⽂件($_POST[‘Upload’])$target_path = DVWA_WEB_PAGE_TO_ROOT . "hackable/uploads/";DVWA_WEB_PAGE_TO_ROOT=E:\phpStudy2019_64\phpstudy_pro\WWW\DVWA$target_path=E:\phpStudy2019_64\phpstudy_pro\WWW\DVWA/hackable/uploads/因此最终你上传的⽂件的最终路径为:$target_path=E:\phpStudy2019_64\phpstudy_pro\WWW\DVWA\hackable\uploads/123.jpg123.jpg就是你要上传的⽬标⽂件。
漏洞利⽤⽂件上传漏洞的利⽤条件:1.能够成功上传⽊马⽂件2.上传⽂件必须能够被执⾏3.上传⽂件的路径必须可知上传⼀句话⽊马上传成功,并返回上传路径打开中国菜⼑,右键添加,(这个url想了⼀会⼉,两个../返回上级,回到了127.0.0.1/dvwa/)然后菜⼑就会通过向服务器发送包含key参数的post请求,在服务器上执⾏任意命令,获取webshell权限。
<?php002这里介绍三种多文件上传的方法,前两种都是直接遍历003三维超全局数组$_FILES,最后一种是先定义一个单文件004上传函数,再循环调用该函数,完成多文件的上传。
0051.当多文件上传表单中多个上传文件的name属性为“pic[]”形式时, 006也即表单为这种形式:007008<form action=""method="post"enctype="multipart/form-data"> 009<input type="hidden"name="MAX_FILE_SIZE"value="">010<input type="file"name="pic[]"/><br><br>011<input type="file"name="pic[]"/><br><br>012<input type="file"name="pic[]"/><br><br>013<input type="file"name="pic[]"/><br><br>014<input type="submit"value="upload"/>015016</form>017018019可用foreach循环上传多个文件:020021//1.获取要上传文件的信息022$up_info=$_FILES['pic'];023024$ob_path="../system";02502 6$typelist=array("image/gif","image/jpeg","image/pjpeg","image/png" ); //定义运行的上传文件类型027 028029for($i=0;$i<count($up_info['name']);$i++){ //foreach 循环处理多个文件上传030//2.判断文件是否上传错误031032if($up_info['error'][$i]>0){ 033switch($up_info['error'][$i]){ 034case1:035$err_info="上传的文件超过了 php.ini 中 upload_max_filesize 选项限制的值";036break;037case2:038$err_info="上传文件的大小超过了 HTML 表单中 MAX_FILE_SIZE 选项指定的值";039break;040case3:041$err_info="文件只有部分被上传";042break;043case4:044$err_info="没有文件被上传";045break;046case6:047$err_info="找不到临时文件夹";048break;049case7:050$err_info="文件写入失败";051break;052default:053$err_info="未知的上传错误";054break;055}056continue($err_info);057}058059060//3.判断文件上传的类型是否合法061062if(!in_array($up_info['type'][$i],$typelist)){063continue('文件类型错误!'.$up_info['type'][$i]);064}065066//4.上传文件的大小过滤067068if($up_info['size'][$i]>1000000){069continue('文件大小超过1000000');070}071072073//5.上传文件名处理074075$exten_name=pathinfo($up_info['name'][$i],PATHINFO_EXTENSION); 076077do{078$main_name=date('YmHis'.'--'.rand(100,999)); 079$new_name=$main_name.'.'.$exten_name;080}while(file_exists($to_path.'/'.$new_name)); 081082083084//6.判断是否是上传的文件,并执行上传085086if(is_uploaded_file($up_info['tmp_name'][$i])){ 08708 8if(move_uploaded_file($up_info['tmp_name'][$i],$ob_path.'/'.$new_n ame)){089echo'文件上传成功!'; 090}else{091echo'上传文件移动失败!'; 092}093}else{094echo'文件不是上传的文件'; 095}096097} //for循环的括号0980992.当多文件上传表单中多个上传文件的name属性为“pic,text,doc,pdf”形式时,100也即表单为这种形式:101102<form action=""method="post"enctype="multipart/form-data"> 103<input type="hidden"name="MAX_FILE_SIZE"value="">104<input type="file"name="pic"/><br><br>105<input type="file"name="text"/><br><br>106<input type="file"name="doc"/><br><br>107<input type="file"name="pdf"/><br><br>108109<input type="submit"value="upload"/>110111</form>112113也可用foreach循环上传多个文件:114115//1.获取要上传文件的信息116$up_info=$_FILES;117118$ob_path="..\system"; 11912 0$typelist=array("image/gif","image/jpeg","image/pjpeg","image/png" ); //定义运行的上传文件类型121 122 123124foreach($up_info as$k_name=>$value){ //用foreach循环处理多个文件的上传125//2.判断文件是否上传错误126127if($up_info[$k_name]['error']>0){ 128switch($up_info['error'][$i]){ 129case1:130$err_info="上传的文件超过了 php.ini 中 upload_max_filesize 选项限制的值";131break; 132case2:133$err_info="上传文件的大小超过了 HTML 表单中 MAX_FILE_SIZE 选项指定的值";134break;135case3:136$err_info="文件只有部分被上传"; 137break;138case4:139$err_info="没有文件被上传";140break;141case6:142$err_info="找不到临时文件夹"; 143break;144case7:145$err_info="文件写入失败";146break;147default:148$err_info="未知的上传错误";149break;150}151continue($err_info);152}154155//3.判断文件上传的类型是否合法156157if(!in_array($up_info[$k_name]['type'],$typelist)){ 158continue('文件类型错误!'.$up_info[$k_name]['type']); 159}160161//4.上传文件的大小过滤162163if($up_info[$k_name]['size']>100000){164echo'文件大小超过**';165continue;166}167168169//5.上传文件名处理17017 1$exten_name=pathinfo($up_info[$k_name]['name'],PATHINFO_EXTENSION) ;172173do{174$main_name=date('YmHis'.'--'.rand(100,999));175$new_name=$main_name.'.'.$exten_name;176}while(file_exists($to_path.'/'.$new_name));177178179//6.判断是否是上传的文件,并执行上传180181if(is_uploaded_file($up_info[$k_name]['tmp_name'])){ 18218 3if(move_uploaded_file($up_info[$k_name]['tmp_name'],$ob_path.'/'.$ new_name)){184echo'文件上传成功!'; 185}else{186echo'上传文件移动失败!'; 187}188}else{189echo'文件不是上传的文件';191192} //for循环的括号193194195196//3.上面的循环是嵌入到文件上传的代码中的,可能有点不好理解,这儿提供第三种法,197//先定义单个文件上传的函数,再循环调用这个函数,每次传入一个文件的上传信息,198//也可以到达多文件上传的目的,而且这种方式,更容易理解。
<?php/***文件的上传:*1.单个文件上传*2.多个文件上传*一、php配置文件中和上传有关的配置选项【经测试,修改配置文件修改的是wamp下的apache下的php.ini】*php.ini里面*file_uploads=on是必须的,不然文件写得再对都上传不到服务器上。
*upload_max_filesize=20M这个值一定不要超过服务器的内存大小。
*post_max_size=250M这个值是post的最大值,一定要比上传文件的最大值要大。
*上传上去的数据临时存在什么地方?upload_tmp_dir=c:/uploads/*在脚本执行完以后,临时文件会删除,所以在脚本执行完以前一定要把你上传的文件copy出来,不然就没了。
**二、上传需要注意的事项*文件上传表单需要注意什么?* 1.如果有文件上传操作,表单的提交方法method=post,必须用post。
* 2.表单上传需要使用类型为file的input* 3.enctype="multipart/form-data"只有文件上传时才用这个,用来指定表单编码的数据方式。
让服务器知道我们要传递文件。
*并带有一些常规的信息。
加在form里面和method一样。
*三、php处理上传的数据*$_POST提取post方法提交的的表单数据,如果是文件上传的数据则使用$_FILES接收文件,而$_POST接收*非文件数据。
所以当要上传文件时用两种方法接收数据。
点击上传后只要将临时文件移动到目标文件夹中就成功了。
*array(size=4)'shopname'=>string'得到'(length=6)'shoppri'=>string'得到'(length=6)'shopnum'=>string'得到'(length=6)'sub'=>string'添加商品'(length=12)array(size=1)'pic'=>array(size=5)'name'=>string'11112907_124211588000_2[1].jpg' (length=30)'type'=>string'image/jpeg'(length=10)'tmp_name'=>string'D:\wamp\tmp\phpDAA.tmp' (length=22)'error'=>int0'size'=>int288127**/header("Content-Type:text/html;charset=utf-8");date_default_timezone_set("PRC");//设置时区if(isset($_POST["sub"])){//var_dump($_POST);//var_dump(__FILE__);//string'D:\wamp\www\mytest\10-29-fileupload01.php'(length=41)//var_dump($_FILES);/*点击上传之后,执行以下操作*///1.使用$_FILES["pic"]["error"]检查错误if($_FILES['pic']['error']>0){switch($_FILES['pic']['error']){case1:echo"上传的文件超过了php.ini中upload_max_filesize选项限制的值<br/>";break;case2:echo"文件大小超过了1M<br/>";break;case3:echo"文件只有部分被上传<br/>";break;case4:echo"没有文件被上传<br/>";break;default:echo"未知错误<br/>";}exit;}//2.使用$_FILES["pic"]["size"]限制大小if($_FILES['pic']['size']>1000000){echo"文件不能大于1M<br/>";exit;}//3.使用$_FILES["pic"]["type"]或文件的扩展名来限制类型。
type的值是"大类型/小类型"如'image/jpeg'//具体有些什么类型,在apache下的bin下的apache下的cof文件夹中有一个mime.types文件中查看//如果是使用大类型来限制,缺点是只要是图片都能传上去,但我们处理不了有些类型的图片,所以不推荐大类型限制方法/*list($dl,$xl)=explode("/",$_FILES["pic"]["type"]);if($dl!="image"){echo"只能上传图像文件。
<br/>";exit;}*//*建议用后缀名来限制类型*/$types=array("jpg","jpeg","png","gif");//允许的文件类型$hzs=explode('.',$_FILES["pic"]["name"]);$hz=$hzs[count($hzs)-1];//从文件名中提取后缀名if(!in_array($hz,$types)){echo"请选择允许的文件类型<br/>";exit;}//4.使用$_FILES["pic"]["name"]改文件名和过滤非法字符。
$tmppath=dirname($_FILES['pic']['tmp_name']);//获取文件上传的临时路径$path="./uploaded_files/";//移动到此路径下$randname=date('Y').date('m').date("d").date('H').d ate('i').date('s').rand(100,999).'.'.$hz;//随机名//将临时文件移动到对应文件夹if(is_uploaded_file($_FILES['pic']['tmp_name'])){if(move_uploaded_file($_FILES['pic']['tmp_name'],$p ath.$randname)){echo"上传成功";}else{echo"上传失败";}}else{var_dump($tmppath.$_FILES['pic']['name']);echo"不是上传的文件。
<br/>";}}?><html><head><meta charset="utf-8"><title>file upload</title></head><body><form action=""method="post"enctype="multipart/form-data">shopname:<input type="text"name="shopname"/><br/> shoppri:<input type="text"name="shoppri"/><br/>shopnum:<input type="text"name="shopnum"/><br/> <!--隐藏域:君子提示,当用户多时,考虑到配置文件php.ini中的post_max_size不能是一个用户上传的最大值,所以表单中要有个MAX_FILE_SIZE的限制.此处限制最大文件大小超过1M--><input type="hidden"name="MAX_FILE_SIZE"value="1000000"/>shoppic:<input type="file"name="pic"/><br/><input type="submit"name="sub"value="添加商品"/><br/> </form></body></html>。