当前位置:Gxlcms > PHP教程 > php文件上传相关限制问题

php文件上传相关限制问题

时间:2021-07-01 10:21:17 帮助过:3人阅读

上传相关限制

1 客户端限制

  1. <form action="doAction2.php" method="post" enctype="multipart/form-data">
  2. <input type="hidden" name="MAX_FILE_SIZE" value="101321" />
  3. 请选择您要上传的文件:
  4. <input type="file" name="myFile" accept="image/jpeg,image/gif,text/html"/><br/>
  5. <input type="submit" value="上传"/>
  6. </form>

这里用input的属性对上传文件的大小和类型进行了限制,但是个人感觉:一,html代码是“可见的”;二,常不起作用(没找到原因,但因为第一个我也想放弃它,知道就好。

2 服务器端限制

主要限制大小和类型,再有就是方式。

  1. <?php
  2. header('content-type:text/html;charset=utf-8');
  3. //接受文件,临时文件信息
  4. $fileinfo=$_FILES["myFile"];//降维操作
  5. $filename=$fileinfo["name"];
  6. $tmp_name=$fileinfo["tmp_name"];
  7. $size=$fileinfo["size"];
  8. $error=$fileinfo["error"];
  9. $type=$fileinfo["type"];
  10. //服务器端设定限制
  11. $maxsize=10485760;//10M,10*1024*1024
  12. $allowExt=array('jpeg','jpg','png','tif');//允许上传的文件类型(拓展名
  13. $ext=pathinfo($filename,PATHINFO_EXTENSION);//提取上传文件的拓展名
  14. //目的信息
  15. $path="uploads";
  16. if (!file_exists($path)) { //当目录不存在,就创建目录
  17. mkdir($path,0777,true);
  18. chmod($path, 0777);
  19. }
  20. //$destination=$path."/".$filename;
  21. //得到唯一的文件名!防止因为文件名相同而产生覆盖
  22. $uniName=md5(uniqid(microtime(true),true)).$ext;//md5加密,uniqid产生唯一id,microtime做前缀
  23. if ($error==0) {
  24. if ($size>$maxsize) {
  25. exit("上传文件过大!");
  26. }
  27. if (!in_array($ext, $allowExt)) {
  28. exit("非法文件类型");
  29. }
  30. if (!is_uploaded_file($tmp_name)) {
  31. exit("上传方式有误,请使用post方式");
  32. }
  33. if (@move_uploaded_file($tmp_name, $uniName)) {//@错误抑制符,不让用户看到警告
  34. echo "文件".$filename."上传成功!";
  35. }else{
  36. echo "文件".$filename."上传失败!";
  37. }
  38. //判断是否为真实图片(防止伪装成图片的病毒一类的
  39. if (!getimagesize($tmp_name)) {//getimagesize真实返回数组,否则返回false
  40. exit("不是真正的图片类型");
  41. }
  42. }else{
  43. switch ($error){
  44. case 1:
  45. echo "超过了上传文件的最大值,请上传2M以下文件";
  46. break;
  47. case 2:
  48. echo "上传文件过多,请一次上传20个及以下文件!";
  49. break;
  50. case 3:
  51. echo "文件并未完全上传,请再次尝试!";
  52. break;
  53. case 4:
  54. echo "未选择上传文件!";
  55. break;
  56. case 7:
  57. echo "没有临时文件夹";
  58. break;
  59. }
  60. }

这里,具体实现都有注释,每一步其实都可以自己试试的,很有趣。

3 封装

函数

  1. <?php
  2. function uploadFile($fileInfo,$path,$allowExt,$maxSize){
  3. $filename=$fileInfo["name"];
  4. $tmp_name=$fileInfo["tmp_name"];
  5. $size=$fileInfo["size"];
  6. $error=$fileInfo["error"];
  7. $type=$fileInfo["type"];
  8. //服务器端设定限制
  9. $ext=pathinfo($filename,PATHINFO_EXTENSION);
  10. //目的信息
  11. if (!file_exists($path)) {
  12. mkdir($path,0777,true);
  13. chmod($path, 0777);
  14. }
  15. $uniName=md5(uniqid(microtime(true),true)).'.'.$ext;
  16. $destination=$path."/".$uniName;
  17. if ($error==0) {
  18. if ($size>$maxSize) {
  19. exit("上传文件过大!");
  20. }
  21. if (!in_array($ext, $allowExt)) {
  22. exit("非法文件类型");
  23. }
  24. if (!is_uploaded_file($tmp_name)) {
  25. exit("上传方式有误,请使用post方式");
  26. }
  27. //判断是否为真实图片(防止伪装成图片的病毒一类的
  28. if (!getimagesize($tmp_name)) {//getimagesize真实返回数组,否则返回false
  29. exit("不是真正的图片类型");
  30. }
  31. if (@move_uploaded_file($tmp_name, $destination)) {//@错误抑制符,不让用户看到警告
  32. echo "文件".$filename."上传成功!";
  33. }else{
  34. echo "文件".$filename."上传失败!";
  35. }
  36. }else{
  37. switch ($error){
  38. case 1:
  39. echo "超过了上传文件的最大值,请上传2M以下文件";
  40. break;
  41. case 2:
  42. echo "上传文件过多,请一次上传20个及以下文件!";
  43. break;
  44. case 3:
  45. echo "文件并未完全上传,请再次尝试!";
  46. break;
  47. case 4:
  48. echo "未选择上传文件!";
  49. break;
  50. case 7:
  51. echo "没有临时文件夹";
  52. break;
  53. }
  54. }
  55. return $destination;
  56. }

调用

  1. <?php
  2. header('content-type:text/html;charset=utf-8');
  3. $fileInfo=$_FILES["myFile"];
  4. $maxSize=10485760;//10M,10*1024*1024
  5. $allowExt=array('jpeg','jpg','png','tif');
  6. $path="uploads";
  7. include_once 'upFunc.php';
  8. uploadFile($fileInfo, $path, $allowExt, $maxSize);

以上就是php文件上传相关限制问题的详细内容,更多请关注Gxl网其它相关文章!

人气教程排行