博客列表 >PHP文件上传

PHP文件上传

王佳祥
王佳祥原创
2020年08月01日 12:03:251529浏览

文件上传

一、PHP上传文件参考配置(php.ini)

配置参数 描述
file_uploads=on/off 是否允许通过http方式上传文件
max_execution_time=30 允许脚本最大执行时间,超过这个时间就会报错
memory_limit=50M 设置脚本可以分配的最大内存量,防止失控脚本占用过多内存,此指令只有在编译时设置了 —enable-memory-limit标志的情况下才生效
upload_max_filesize=20M 允许上传文件的最大大小,此指令必须小于post_max_size
upload_tmp_dir 上传文件临时存放目录
post_max_size=30M 允许post方式可以接受最大大小

二、$_FILES超全局变量数组,保存着与文件上传的相关信息

数组参数 描述
[name] 客户端文件的原名称。
[type] 文件的 MIME 类型,需要浏览器提供该信息的支持,例如”image/gif”。
[size] 已上传文件的大小,单位为字节。
[tmp_name] 文件被上传后在服务端储存的临时文件名,一般是系统默认。可以在php.ini的upload_tmp_dir 指定,但 用 putenv() 函数设置是不起作用的。
[error] 和该文件上传相关的错误代码。
错误代码 描述
0 没有错误发生,文件上传成功。
1 上传的文件超过了 php.ini 中 upload_max_filesize 选项限制的值。
2 上传文件的大小超过了 HTML 表单中 MAX_FILE_SIZE 选项指定的值。
3 文件只有部分被上传。
4 没有文件被上传。
5 上传文件大小为0.

1.$_FILES练习

  1. <?php
  2. //$_FILES超全局变量数组,保存着所有与文件上传的相关消息
  3. printf('<pre>%s</pre>',print_r($_FILES,true));
  4. ?>
  5. <!DOCTYPE html>
  6. <html lang="en">
  7. <head>
  8. <meta charset="UTF-8">
  9. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  10. <title>文件上传</title>
  11. </head>
  12. <body>
  13. <form enctype="multipart/form-data" action="" method="post">
  14. <fieldset>
  15. <input type="hidden" name="MAX_FILE_SIZE" value="300000">
  16. <legend>文件上传</legend>
  17. <input name="myFile" type="file">
  18. <input type="submit" value="上传文件">
  19. </fieldset>
  20. </form>
  21. </body>
  22. </html>
  • 上传小于限制大小的图片


  • 上传大于限制大小的图片


  1. 检查文件是否上传成功
  1. <?php
  2. //$_FILES超全局变量数组,保存着所有与文件上传的相关消息
  3. printf('<pre>%s</pre>',print_r($_FILES,true));
  4. //获取上传错误的代码
  5. $errorCode = $_FILES['myFile']['error'] ?? null;
  6. //2.判断
  7. if($errorCode === 4) echo '<p>没有文件上传</p>';
  8. //if(empty($_FILES['myFile']['name'])) echo '<p>没有文件上传</p>';
  9. ?>
  10. <!DOCTYPE html>
  11. <html lang="en">
  12. <head>
  13. <meta charset="UTF-8">
  14. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  15. <title>文件上传</title>
  16. </head>
  17. <body>
  18. <form enctype="multipart/form-data" action="" method="post">
  19. <fieldset>
  20. <input type="hidden" name="MAX_FILE_SIZE" value="300000">
  21. <legend>文件上传</legend>
  22. <input name="myFile" type="file">
  23. <input type="submit" value="上传文件">
  24. </fieldset>
  25. </form>
  26. </body>
  27. </html>


3. 判断临时文件是否是通过post方式上传

  1. <?php
  2. //$_FILES超全局变量数组,保存着所有与文件上传的相关消息
  3. printf('<pre>%s</pre>',print_r($_FILES,true));
  4. //判断:1.临时文件名2.is_uploadede_file()
  5. //is_uploaded_file() 函数检查指定的文件是否是通过 HTTP POST 上传的。
  6. //1.原始文件名
  7. $origianlFileName = $_FILES['myFile']['name'] ?? null;
  8. //2.临时文件名
  9. $tmplFileName = $_FILES['myFile']['tmp_name'] ?? null;
  10. //首先临时文件是存在的,并且必须通过post上传
  11. if($tmplFileName && is_uploaded_file($tmplFileName)) echo '<p>上传方式正确</p>';
  12. else echo '上传类型错误';
  13. ?>
  14. <!DOCTYPE html>
  15. <html lang="en">
  16. <head>
  17. <meta charset="UTF-8">
  18. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  19. <title>文件上传</title>
  20. </head>
  21. <body>
  22. <form enctype="multipart/form-data" action="" method="post">
  23. <fieldset>
  24. <legend>文件上传</legend>
  25. <input name="myFile" type="file">
  26. <input type="submit" value="上传文件">
  27. </fieldset>
  28. </form>
  29. </body>
  30. </html>


4.检查文件类型

  1. <?php
  2. //$_FILES超全局变量数组,保存着所有与文件上传的相关消息
  3. printf('<pre>%s</pre>',print_r($_FILES,true));
  4. $fileType = $_FILES['myFile']['type'] ?? null;
  5. //strstr()返回斜线后面的内容,true返回斜线前面的内容
  6. $type = strstr($fileType,'/',true);
  7. if($type !== 'image') echo '文件类型错误:不是有效的图片格式';
  8. echo '类型正确';
  9. ?>
  10. <!DOCTYPE html>
  11. <html lang="en">
  12. <head>
  13. <meta charset="UTF-8">
  14. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  15. <title>检查文件类型</title>
  16. </head>
  17. <body>
  18. <form enctype="multipart/form-data" action="" method="post">
  19. <fieldset>
  20. <legend>文件上传</legend>
  21. <input name="myFile" type="file">
  22. <input type="submit" value="上传文件">
  23. </fieldset>
  24. </form>
  25. </body>
  26. </html>




5.检测文件大小是否超过php.ini设置的大小

  1. <?php
  2. //$_FILES超全局变量数组,保存着所有与文件上传的相关消息
  3. printf('<pre>%s</pre>',print_r($_FILES,true));
  4. //echo ini_get('upload_max_filesize');
  5. //1.获取上传错误的代码
  6. $errorCode = $_FILES['myFile']['error'] ?? null;
  7. switch ($errorCode){
  8. case 1:
  9. echo '超过了php.ini的大小设置';
  10. break;
  11. case 2:
  12. echo '超过了表单的大小设置';
  13. break;
  14. }
  15. ?>
  16. <!DOCTYPE html>
  17. <html lang="en">
  18. <head>
  19. <meta charset="UTF-8">
  20. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  21. <title>检查文件类型</title>
  22. </head>
  23. <body>
  24. <form enctype="multipart/form-data" action="" method="post">
  25. <fieldset>
  26. <legend>文件上传</legend>
  27. <!-- <input type="hidden" name="MAX_FILE_SIZE" value="300000"> -->
  28. <input name="myFile" type="file">
  29. <input type="submit" value="上传文件">
  30. </fieldset>
  31. </form>
  32. </body>
  33. </html>


三、单文件上传

  1. <?php
  2. error_reporting(E_ALL);
  3. //$_FILES超全局变量数组,保存着所有与文件上传的相关消息
  4. //printf('<pre>%s</pre>',print_r($_FILES,true));
  5. /***********************************************************/
  6. class E extends Exception
  7. {
  8. public function __tostring()
  9. {
  10. return <<< HERE
  11. <table border="1px" cellspacing="0" cellpadding="10px">
  12. <tr>
  13. <td>编号</td>
  14. <td>信息</td>
  15. <td>文件</td>
  16. <td>行号</td>
  17. </tr>
  18. <tr>
  19. <td>$this->code</td>
  20. <td>$this->message</td>
  21. <td>$this->file</td>
  22. <td>$this->line</td>
  23. </tr>
  24. </table>
  25. HERE;
  26. }
  27. }
  28. /***********************************************************/
  29. try{
  30. //对错误编码的判断
  31. //获取错误代码
  32. $ECode = $_FILES['myFile']['error'] ?? null;
  33. //var_dump($ECode);
  34. //使用系统常量进行判断
  35. if($ECode > UPLOAD_ERR_OK){
  36. switch ($ECode){
  37. case UPLOAD_ERR_INI_SIZE:
  38. throw new E('上传的文件超过了php.ini中设置的大小',1001);
  39. break;
  40. case UPLOAD_ERR_FORM_SIZE:
  41. throw new E('上传的文件超过了表单中设置的大小',1002);
  42. break;
  43. case UPLOAD_ERR_PARTIAL:
  44. throw new E('文件只有部分被上传',1003);
  45. break;
  46. case UPLOAD_ERR_NO_FILE:
  47. throw new E('没有文件被上传',1004);
  48. break;
  49. case UPLOAD_ERR_NO_TMP_DIR:
  50. throw new E('找不到临时文件',5);
  51. break;
  52. case UPLOAD_ERR_CANT_WRITE:
  53. throw new E('文件写入失败',6);
  54. break;
  55. default:
  56. //测试时建议关闭
  57. //throw new E('未知类型错误',1007);
  58. break;
  59. }
  60. }
  61. /***********************************************************/
  62. //对文件类型的判断
  63. //获取文件类型
  64. $fileType = $_FILES['myFile']['type'] ?? null;
  65. //截取文件类型 image
  66. $type = strstr($fileType, '/',true);
  67. //var_dump($type);
  68. if($type && $type !== 'image'){
  69. throw new E ('文件类型错误:不是有效的图片格式',1008);
  70. }
  71. /***********************************************************/
  72. //判断上传方式是否正确
  73. //获取文件名
  74. $fileName = $_FILES['myFile']['name'] ?? null;
  75. //获取临时文件名
  76. $tmpName = $_FILES['myFile']['tmp_name'] ?? null;
  77. //判断临时文件名是否存在并且是否通过post方式上传
  78. if($tmpName && is_uploaded_file($tmpName)){
  79. //echo '<p>'.$fileName.':上传方式正确';
  80. //将文件从临时文件移动到目标目录中
  81. //move_uploaded_file(临时文件,目标文件)
  82. //获取文件扩展名
  83. $extends = strstr($fileName,'.');
  84. //设置目标文件名并加密
  85. $destFileName = 'uploads/'.md5(time().mt_rand(1,1000)).$extends;
  86. if(move_uploaded_file($tmpName,$destFileName)){
  87. echo '<p>'.$fileName.':上传成功</p>';
  88. echo "<img src='{$destFileName}' width='100px'>";
  89. }
  90. }
  91. /***********************************************************/
  92. }catch(E $e){
  93. echo $e;
  94. }
  95. /***********************************************************/
  96. ?>
  97. <!DOCTYPE html>
  98. <html lang="en">
  99. <head>
  100. <meta charset="UTF-8">
  101. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  102. <title>文件上传</title>
  103. </head>
  104. <body>
  105. <form enctype="multipart/form-data" action="" method="post">
  106. <fieldset>
  107. <!-- <input type="hidden" name="MAX_FILE_SIZE" value="300000"> -->
  108. <legend>文件上传</legend>
  109. <input name="myFile" type="file">
  110. <input type="submit" value="上传文件">
  111. </fieldset>
  112. </form>
  113. </body>
  114. </html>








四、多文件上传

  1. <?php
  2. error_reporting(E_ALL);
  3. printf('<pre>%s</pre>',print_r($_FILES,true));
  4. /*******************************************************************************/
  5. try {
  6. foreach ($_FILES as $file){
  7. if($file['type'] && strstr($file['type'],'/',true) !== 'image')
  8. {
  9. echo $file['name'].':文件类型错误:不是有效的图片格式';
  10. $file['error'] = 4;
  11. }
  12. switch ($file['error'])
  13. {
  14. case 0:
  15. //上传成功,并保存到目标文件中
  16. $destFileName = 'uploads/'.md5(time().mt_rand(1,1000)).strstr($file['type'],'.');
  17. if(move_uploaded_file($file['tmp_name'],$destFileName)){
  18. echo '<p>'.$file['name'].':上传成功</p>';
  19. echo "<img src='{$destFileName}' width='100px'>";
  20. }
  21. break;
  22. case UPLOAD_ERR_INI_SIZE:
  23. echo $file['name'].':上传的文件超过了php.ini中设置的大小<br>';
  24. break;
  25. case UPLOAD_ERR_FORM_SIZE:
  26. echo $file['name'].':上传的文件超过了表单中设置的大小<br>';
  27. break;
  28. case UPLOAD_ERR_PARTIAL:
  29. echo $file['name'].':文件只有部分被上传<br>';
  30. break;
  31. case UPLOAD_ERR_NO_FILE:
  32. echo $file['name'].':没有文件被上传<br>';
  33. break;
  34. case UPLOAD_ERR_NO_TMP_DIR:
  35. echo $file['name'].':找不到临时文件<br>';
  36. break;
  37. case UPLOAD_ERR_CANT_WRITE:
  38. echo $file['name'].':文件写入失败<br>';
  39. break;
  40. default:
  41. //测试时建议关闭
  42. echo $file['name'].':未知类型错误<br>';
  43. break;
  44. }
  45. }
  46. }catch(E $e){
  47. echo $e;
  48. }
  49. ?>
  50. <!DOCTYPE html>
  51. <html lang="en">
  52. <head>
  53. <meta charset="UTF-8">
  54. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  55. <title>多文件上传</title>
  56. </head>
  57. <body>
  58. <form action="" method="post" enctype="multipart/form-data">
  59. <fieldset>
  60. <legend>批量文件上传</legend>
  61. <input type="file" name="myFile1" id="">
  62. <input type="file" name="myFile2" id="">
  63. <input type="file" name="myFile3" id="">
  64. <button>上传</button>
  65. </fieldset>
  66. </form>
  67. </body>
  68. </html>






声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议