zoukankan      html  css  js  c++  java
  • php之文件上传深度剖析

    引子:

      转眼工作已有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 图片如下:

    红色标注的就是表单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的变化,这里随便网上找了个文件夹监控软件来监控这个文件

    到这里就有疑问了,如果我们以前是写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上传至于要复制下临时文件

      

  • 相关阅读:
    apktool 在mac下的使用 -反编译安卓apk文件
    通过Stetho在Chrome上调试Android App
    Android Studio 遇到 No Debuggable Applications 的解决方案
    安装Eclipse Maven插件的方法
    Android如何实现点击一次返回键返回桌面而不是退出应用
    安卓7.0遇到 android.os.FileUriExposedException: file:///storage/emulated.. exposed beyond app through Intent.getData()
    由Memcached使用不当而引发性能问题的两个经验总结
    对MySql查询缓存及SQL Server过程缓存的理解及总结
    由Java中toString()方法引发的无意识的递归想到的
    为什么不能把委托(delegate)放在一个接口(interface)当中?
  • 原文地址:https://www.cnblogs.com/echosong/p/2841462.html
Copyright © 2011-2022 走看看