设为首页 收藏本站
查看: 828|回复: 0

[经验分享] php之文件上传深度剖析

[复制链接]

尚未签到

发表于 2015-8-27 12:07:05 | 显示全部楼层 |阅读模式
  引子:
    转眼工作已有4载有余,今天正好是第五个年头的第一天,以前所有的笔记都是随便一个文件保存,从未分享大博客或者论坛。平时也很少写文字。现在写起来即使心有料但笔难发。新的一年开始了那么就做一个新的自己,提笔分析。
  正文:
    相信有过web开发的朋友上传是每个开发者必然用到的一个功能,网上类似的文章源码度娘一搜,结果多的人你数页数都数不过了,所以这里的上传功能怎么用不是本文的重点
  http本身对上传文件的http头有个特殊的标记也就是request payLoad 一般我们上传用到的file html控件 上传表单设置enctype="multipart/form-data"(这个东西相信大家都知道其作用)
  接下来我们以php作为服务器端接收来了解下整个过程,然后再对过程进行一些剖析:
  客户端代码



<form name="upload" id="upload" method="post" action="up.php" enctype="multipart/form-data">
<input type="file" onchange="uploads();" class="file" name="field" />
</form>
<script type="text/javascript">
function uploads(){
document.getElementById('upload').submit();
document.body.innerHTML = '<div><img border="0" width="16" height="16" src="../inc/templates/manage/images/wait.gif" /></div>';
}
</script>
  当点击的时候我们来监控htpp 图片如下:
DSC0000.jpg
  红色标注的就是表单enctype="multipart/form-data"跟其他一般提交方式的不同,通过这种格式想服务器端up.php文件进行请求,接下来服务器端我们要讲的重点来了,在php环境中无论是web服务器采用apache,nginx更或者是iis这些都web服务器的职责仅仅只是接受http协议的请求,接受后都是交给php去处理。
  那么php接受到这个请求后到底是什么原理来处理的呢,我们写过php的人知道是存在一个临时文件,php.ini文件下配置的路径 我本地路径是E:/wamp/tmp,首先我们来写一个空的up.php文件 里面什么代码都不写然后来观察E:/wamp/tmp的变化,这里随便网上找了个文件夹监控软件来监控这个文件
DSC0001.jpg
  到这里就有疑问了,如果我们以前是写asp程序 或者php程序员没有留意的人会疑问,问什么我up.php文件任何代码都没写,临时文件里面怎么会有文件变化,如果按道理应该是 就是客户端请求的流文件然后写入到文件里头在处理,而我们任何代码未写却在服务器的php临时文件上储存了文件。
  这里有朋友会问那是不是回事web服务器来处理的,这里我们把表单的的up.php 改成up.html观察文件夹变化的结果就是,不会发生任何变化
  对,没错这就是php的强大之处,这写步骤当web服务器把http请求交给php的时候 php内部就有这个机制把requeset payLoad部分已经自动给写入到临时文件保存,而且只要请求响应接受 自动删除。
  既然php内置有直接接受处理request payLoad 部分的能力,那么显而易见上传在php里看来就是件非常容易的事情,我们要做的仅仅只是在处理请求的时候把临时文件夹里面这个临时文件复制到我们需要的地方就ok了,听明白了,仅仅只要复制,而且php内置还直接告诉你当前处理请求的文件名了代码就是



Copy($_FILES['userfile']['tmp_name'],目标文件)
  一句话完成了整个上传,当然处于安全我可以做些许代码的处理,比如后缀名格式,文件大小呀
  
  总结:
  1.php上传 php内置已经给处理好了接收http的 request payLoad请求
  2.php上传至于要复制下临时文件
  
  
  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-105003-1-1.html 上篇帖子: 使用 php ssh2 模块实现远程执行命令 下篇帖子: PHP网站在Linux服务器上安全设置方案
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表