1.文件上传实例:

upload.php<html>
<head><meta http-equiv="content-type" content="text/html;charset=utf-8"/>
</head><body>
<form action="doAction1.php" method="post" enctype="multipart/form-data">选择上传的文件<input type="file" name="myfile"/><br/>输入:<input type="text" name="mytext"/><br/><input type="submit" value="提交"/>
</form>
</body>
</html>
doAction1.php<?php//1.通过 $_FILES 文件上传变量接受上传文件信息
//var_dump($_FILES);die;
$fileInfo = $_FILES['myfile'];
$filename = $fileInfo['name'];
$type = $fileInfo['type'];
$tmp_name = $fileInfo['tmp_name'];
$error = $fileInfo['error'];
$size = $fileInfo['size'];//2.判断下错误号,只有为0或者是UPLOAD_ERR_OK,没有发生错误,上传成功
if($error == 0){if(move_uploaded_file($tmp_name,'./uploads./' . $filename)){echo '上传成功';}else{echo '上传失败';}
}else{//匹配错误信息switch($error){case 1:echo "上传文件超过了PHP配置文件中upload_max_filesize选项的值";break;case 2:echo "超过了表单max_file_size限制的大小";break;case 3:echo "部分文件被上传";break;case 4:echo "没有选择上传文件";break;case 6:echo "没有找到临时目录";break;case 7:case 8:echo "系统错误";break;}
}

2.客户端做限制

2.1 限制大小
话说 MAX_FILE_SIZE

PHP关于文件上传部分,特别提到表单隐藏域:MAX_FILE_SIZE,意思是接收文件的最大尺寸。文档中给出的例子如下:
<form enctype="multipart/form-data" action="_URL_" method="POST">
<input type="hidden" name="MAX_FILE_SIZE" value="30000">
Send this file: <input name="userfile" type="file">
<input type="submit" value="Send File">
</form>
这 里设置MAX_FILE_SIZE = 30000,期待一种可能,
使得浏览器在传送文件之前能够依此作出预先判断,
如果文件尺寸大于30000字节,则不执行实际的POST动作。
也就是不往服务器发送文件内容,而是直接在客户
端提醒用户“你试图上传的文件超过30000字节”。
这的确是一个非常棒的主张,但在现实中却暂时无法实现。
不是因为这个限制可以“被简单地绕过”,而
是IE和FireFox这两个主流浏览器都不支持这个特性。
PHP的这个建议尚未被采纳。
MAX_FILE_SIZE还有一个用场:后台PHP会判断接收
到的文件大小是否大于这个值,如果超出,$_FILES['thisfile']['error']会被
设置为UPLOAD_ERR_FORM_SIZE(2),同时放弃
保存临时文件,将$_FILES['thisfile']['size']置0。
这个例子,没问题,表现正常,当我试图上传
一个40多K的文件时,PHP程序报告“文件超过MAX_FILE_SIZE”。
但是,如果我们将表单中的MAX_FILE_SIZE
从30000减少到1000,情形又如何呢?
上传800字节的文件,正常;
上传40K的文件,PHP报告文件过大,也正常;
上传3000个字节的文件,PHP未报告错误,
它成功保存了文件!出乎意料!
问题就出在main/rfc1867.c中判断文件是否
超长的这部分代码上。php每次从buffer中
读取FILLUNIT字节长度的内容后,首先判断“已经
读到的内容长度(total_bytes)”是否大
于MAX_FILE_SIZE,然后再增加“已经读到的内容
长度(total_bytes)”。这样一来,和预计的结果之
间至多会有FILLUNIT字节的误差,
而FILLUNIT=1024*5=5K。(点击bug了解详细内容)
这就是说,当MAX_FILE_SIZE<5K时,上传一个大于MAX_FILE_SIZE,但是小于5K的文件是没有问题的。
当然,因为这个设置很容易被绕过,所以服务器端编
程不应当依赖于MAX_FILE_SIZE。而且,5K到底
是个很小的数值,对大多数上传文件的表单来说没有影响。
btw, PHP中post_max_size,upload_max_filesize, MAX_FILE_SIZE的设置,和客户端上传给服务器端
的流量大小无关。Apache服务器从客户端接收长
度不超过LimitRequestBody字节数的请求,然后
传送给php模块,php模块再决定是否保存成临时文件,
设置$_FILES全局变量,移交给script进一步处理。
这个Apache的LimitRequestBody选项缺省值=0,允许Request body的最大字节数是2G(Linux + Apache)

也就是说,MAX_FILE_SIZE这个属性客户端的浏览器未必支持。
bug : http://bugs.php.net/bug.php?id=33666

建议顺序:

关于临时目录:

2.2 限制类型

选择上传的文件<input type="file" name="myfile" accept="image/png"/><br/>



记住:客户端限制不靠谱 !


3.服务器端做限制:













检测是否为真实的图片:



//确保文件名唯一,防止重名产生覆盖$uniq=date('YmdHis').rand(1,9999);
<?php
header('Content-Type:text/html;charset=utf-8');$fileInfo = $_FILES['myfile'];
$maxSize = 2097152;
$allowExt = array('jepg','jpg','gif');
$flag = true;//检测是否为真实的图片类型
//1.判断错误号
if($fileInfo['error']==0){//判断上传文件大小if($fileInfo['size']>$maxSize){exit('上传文件大小不符合规范');}//$ext = strtolower(end(explode('.',$fileInfo['name'])));$ext = pathinfo($fileInfo['name'],PATHINFO_EXTENSION);//var_dump($ext);die;if(!in_array($ext,$allowExt)){exit('非法文件类型');}//判断文件是否通过HTTP POST 方式传上来的,检测的是临时文件if(!is_uploaded_file($fileInfo['tmp_name'])){exit('文件不是通过HTTP POST 方式传上来的');}if($flag){if(!getimagesize($fileInfo['tmp_name'])){exit('不是真的图片类型');}}$path = './uploads';//如果指定的目录不存在,则创建if(!file_exists($path)){mkdir($path,0777,true);chmod($path,0777);}//确保文件名唯一,赋值重名产生覆盖$uniName = md5(uniqid(microtime(true),true)) . '.' . $ext;// echo $uniName;die;$destination = $path . '/' . $uniName;if(move_uploaded_file($fileInfo['tmp_name'],$destination)){echo "文件上传成功{$fileInfo['name']}";}
}else{//匹配错误信息switch($fileInfo['error']){case 1:echo "上传文件超过了PHP配置文件中upload_max_filesize选项的值";break;case 2:echo "超过了表单max_file_size限制的大小";break;case 3:echo "部分文件被上传";break;case 4:echo "没有选择上传文件";break;case 6:echo "没有找到临时目录";break;case 7:case 8:echo "系统错误";break;}
}

73. 文件上传(2)相关推荐

  1. nodejs文件服务器断点续传,基于Nodejs的大文件上传之断点续传

    接着<扒一扒Nodejs formidable的onPart>和<也说文件上传之兼容IE789的进度条---丢掉flash>:前面已完成兼容IE789的大文件上传:无flash ...

  2. struts2的文件上传和文件下载

    实现使用Struts2文件上传和文件下载: 注意点: (1)对应表单的file1和私有成员变量的名称必须一致 <input type="file" name="fi ...

  3. .NET技术 ASP.NET中常用的文件上传下载方法(多文件上传)

    文件的上传下载是我们在实际项目开发过程中经常需要用到的技术,这里给出几种常见的方法,本文主要内容包括: 1.如何解决文件上传大小的限制 2.以文件形式保存到服务器 3.转换成二进制字节流保存到数据库以 ...

  4. SpringMVC整合fastdfs-client-java实现web文件上传下载

    为什么80%的码农都做不了架构师?>>>    版权声明:本文为博主原创文章,转载请标明出处(http://blog.csdn.net/wlwlwlwl015)Thanks. 目录( ...

  5. java使用Jsch实现远程操作linux服务器进行文件上传、下载,删除和显示目录信息...

    1.java使用Jsch实现远程操作linux服务器进行文件上传.下载,删除和显示目录信息. 参考链接:https://www.cnblogs.com/longyg/archive/2012/06/2 ...

  6. js插件---IUpload文件上传插件(包括图片)

    js插件---IUpload文件上传插件(包括图片) 一.总结 一句话总结:上传插件找到真正上传位置的代码,这样就可以知道整个上传插件的逻辑了, 找资料还是github+官方 1.如何在js中找到真正 ...

  7. ajaxFileUpload文件上传

    一.简介 ajaxFileUpload是一种异步的文件上传控件,通过ajax进行文件上传,并获取上传处理结果.在很多时候我们需要使用到文件上传的功能,但是不需要使用那些强大的上传插件.此时就可以使用a ...

  8. JavaWeb实现文件上传下载功能实例解析

    转:http://www.cnblogs.com/xdp-gacl/p/4200090.html JavaWeb实现文件上传下载功能实例解析 在Web应用系统开发中,文件上传和下载功能是非常常用的功能 ...

  9. 用openoffice+jodconverter+webuploader+pdf.js实现文件上传、在线预览功能

    一.背景 最近公司一个项目要实现一个文件上传以及多文档在线预览的功能,之前一直做无线工具开发的,没有涉及到这些东西.另外项目组缺java开发人员,而且自己也只是一个半吊子前端加小半吊子java开发人员 ...

  10. OkHttp实现文件上传进度

    文件上传就一个没刻度的进度条在那里转怎么行,本篇带你实现上传进度,为你的进度条添加刻度吧,啥都不说了,重点重写RequestBody,看代码 import com.squareup.okhttp.*; ...

最新文章

  1. php 的opcode缓存apc以及其安装
  2. 30个 Web 设计者 必备的免费 PSD UI 工具包
  3. snort完整安装(snort-2.8.3.1)
  4. JavaScript 判断 DOM 何时加载完毕
  5. Java Review - 并发编程_Unsafe
  6. 为什么在Docker里使用gdb调试器会报错
  7. 【收藏】Vue+elementUI的this.$refs.对象名.方法名的理解
  8. linux mysql5.7启动失败/tmp/mysql.sock ?
  9. OpenGLES渲染
  10. Futureswap公布代币分配时间表,在未来3年向用户分配3000万枚FST代币
  11. 你根本就不需要认识这么多大佬
  12. 【计算机组成原理】重点总结(详版)
  13. 两台电脑的文件共享方式
  14. 计算机无法添加打印机,电脑无法添加网络打印机,怎么办?
  15. SAP Fiori 的附件处理(Attachment handling)
  16. 基于SSM实现的儿童疫苗信息管理系统设计与实现毕业设计源码311930
  17. linux集群渲染动画,集群渲染
  18. 关于电信路由猫、无线路由猫的设置
  19. TCP状态转换图文解说
  20. 洛谷 p2387 [noi2014] 膜fa♂森林 lct维护最小生成树

热门文章

  1. C#中 String 格式的日期时间 转为 DateTime
  2. [js开源组件开发]js文本框计数组件
  3. 实例变量,局部变量,全局变量,静态全局变量。
  4. java用Calendar计算年龄的问题
  5. js校验规则--去空格、加空格
  6. [Python3] 面向对象编程
  7. JQuery中关于html()、text()、val()三者之间的区别
  8. 为啥学蛇和python10年后的变化
  9. 查看电脑的s/n序列号信息方式
  10. Jquery小菜鸟---防止按钮在短时间内被多次点击