Blogger Information
Blog 48
fans 3
comment 1
visits 30643
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
PHP文件上传原理及错误处理
吴长清
Original
438 people have browsed it

1.文件上传

文件上传的两个前提
1.必须以POST方式提交,method: POST
2.必须将编码类型转为多种数据提交,enctype="multipart/form-data"
multipart/form-data是指表单数据有多部分构成,既有文本数据,又有文件等二进制数据

1.1 单文件上传

form表单

  1. <!-- action 服务端地址 这里在同一个文件中处理,可以不指定php服务端地址 -->
  2. <form action="" method="POST" enctype="multipart/form-data">
  3. <fieldset>单文件上传</fieldset>
  4. <!-- name="my_pic":给服务器编程语言用的变量名,php中可通过$_FILES来访问 -->
  5. <input type="file" name="my_pic">
  6. <button>上传</button>
  7. </form>

PHP服务端

  1. <?php
  2. namespace fielUpload;
  3. // 格式化输出 $_FILES 相关信息
  4. printf('<pre>%s</pre>', print_r($_FILES, true));
  5. // 判断是否为空
  6. if (isset($_FILES['my_pic'])) {
  7. if ($_FILES['my_pic']['error'] === 0) {
  8. // 获取扩展名
  9. $ext = pathinfo($_FILES['my_pic']['name'])['extension'];
  10. // 重置文件命及扩展名
  11. $fileName = md5($_FILES['my_pic']['name']) . '.' . $ext;
  12. // 目标文件目录
  13. $dest = 'uploads/' . $fileName;
  14. // 移动到目标目录中
  15. // 参数1:临时文件目录
  16. // 参数2:目标文件目录
  17. move_uploaded_file($_FILES['my_pic']['tmp_name'], $dest);
  18. // 预览
  19. echo "<img src='$dest' width='200'>";
  20. }
  21. }
  22. ?>

$_FILES数据

  1. // 前端传过来的变量名
  2. [my_pic] => Array
  3. (
  4. // 文件名
  5. [name] => 1 (1).jpg
  6. // 文件类型
  7. [type] => image/jpeg
  8. // 临时文件名
  9. [tmp_name] => D:\AnZhuangLuJi\AAAPHP\phpEnv\temp\php\php18C4.tmp
  10. // 错误处理代码 0表示成功
  11. [error] => 0
  12. // 文件大小
  13. [size] => 5850144
  14. )

1.2 多文件上传(逐个上传)

form表单

  1. <!-- action 服务端地址 这里在同一个文件中处理,可以不指定php服务端地址 -->
  2. <form action="" method="POST" enctype="multipart/form-data">
  3. <fieldset>单文件上传</fieldset>
  4. <input type="file" name="my_pic1">
  5. <input type="file" name="my_pic2">
  6. <input type="file" name="my_pic3">
  7. <button>上传</button>
  8. </form>

PHP服务端

  1. <?php
  2. namespace fielUpload;
  3. // 格式化输出 $_FILES 相关信息
  4. printf('<pre>%s</pre>', print_r($_FILES, true));
  5. foreach ($_FILES as $file) {
  6. // 只要判断$file['error'] === 0 表示上传成功
  7. if ($file['error'] === 0) {
  8. // 获取扩展名
  9. $ext = pathinfo($file['name'])['extension'];
  10. // 重置文件命及扩展名
  11. $fileName = md5($file['name']) . '.' . $ext;
  12. // 目标文件目录
  13. $dest = 'uploads/' . $fileName;
  14. // 移动到目标目录中
  15. move_uploaded_file($file['tmp_name'], $dest);
  16. // 预览
  17. echo "<img src='$dest' width='200'>";
  18. }
  19. }
  20. ?>

1.3 多文件上传(统一上传)

form表单

  1. <!-- action 服务端地址 这里在同一个文件中处理,可以不指定php服务端地址 -->
  2. <form action="" method="POST" enctype="multipart/form-data">
  3. <fieldset>单文件上传</fieldset>
  4. <!-- 以数组的方式存放 -->
  5. <!-- multiple: 允许同时选择多个 -->
  6. <input type="file" name="my_pic[]" multiple>
  7. <button>上传</button>
  8. </form>

PHP服务端

  1. <?php
  2. namespace fielUpload;
  3. // 格式化输出 $_FILES 相关信息
  4. printf('<pre>%s</pre>', print_r($_FILES, true));
  5. // 判断是否为空
  6. if (isset($_FILES['my_pic'])) {
  7. //循环遍历
  8. foreach ($_FILES['my_pic']['error'] as $key => $error) {
  9. // 0 => UPLOAD_ERR_OK
  10. if ($error === UPLOAD_ERR_OK) {
  11. // 临时文件名
  12. $tmpName = $_FILES['my_pic']['tmp_name'][$key];
  13. // 获取扩展名
  14. $ext = pathinfo($_FILES['my_pic']['name'][$key])['extension'];
  15. // 重置文件命及扩展名
  16. $fileName = md5($_FILES['my_pic']['name'][$key]) . '.' . $ext;
  17. // 目标文件目录
  18. $dest = 'uploads/' . $fileName;
  19. // 移动到目标目录中
  20. move_uploaded_file($tmpName, $dest);
  21. // 预览
  22. echo "<img src='$dest' width='200'>";
  23. }
  24. }
  25. }
  26. ?>

2.错误处理

  1. // 判断上传的数据是否为空
  2. if (isset($_FILES['my_pic'])) {
  3. // 原始文件名
  4. $name = $_FILES['my_pic']['name'];
  5. // 临时文件名
  6. $tmpName = $_FILES['my_pic']['tmp_name'];
  7. // 错误代码
  8. $error = $_FILES['my_pic']['error'];
  9. //判断错误代码是否大于0,如果大于0 表示上传失败
  10. if ($error >0) {
  11. $tips = '<span style="color:red">上传失败!</span><br>';
  12. // 不同的错误代码 输出不同的错误信息
  13. // 其中错误代码5 是预留的自定义错误信息
  14. switch ($error) {
  15. case 1:
  16. $tips .= '大小超过了php.ini中的允许上传的文件大小';
  17. break;
  18. case 2:
  19. // MAX_FILE_SIZE:前端中传过来的最大文件大小限制的变量
  20. $tips .= '大小超过了表单中(MAX_FILE_SIZE)的允许上传的文件大小';
  21. break;
  22. case 3:
  23. $tips .= '文件只有部分被上传';
  24. break;
  25. case 4:
  26. $tips .= '没有文件被上传';
  27. break;
  28. case 6:
  29. $tips .= '找不到临时目录';
  30. break;
  31. case 7:
  32. $tips .= '文件写入失败,请检查目录权限';
  33. break;
  34. }
  35. echo "<p>$tips</p>";
  36. } else {
  37. //1 判断上传方式是否合法? POST
  38. if (is_uploaded_file($tmpName)) {
  39. // 文件类型白名单
  40. $allow = ['jpg','jpeg','png','gif'];
  41. // 扩展名
  42. $ext = pathinfo($name)['extension'];
  43. // 判断文件上传的扩展名是否为图片的扩展名
  44. if (in_array($ext, $allow)) {
  45. // 如果上传方式合法,且是允许的类型,则可以移动到指定的目录中了
  46. $path = 'uploads/';
  47. // 为了防止同名覆盖,应该给目标文件名重命名
  48. $dest =$path. md5($name) . '.' . $ext;
  49. // 判断将文件从临时目录移动到目标目录中是否成功
  50. if (move_uploaded_file($tmpName, $dest)) {
  51. echo '<p>上传成功</p>';
  52. // 预览
  53. echo "<img src='$dest' width='300'>";
  54. } else {
  55. echo '<p>上传失败</p>';
  56. }
  57. } else {
  58. echo '<p>文件类型错误</p>';
  59. }
  60. } else {
  61. echo '<p>上传方式非法</p>';
  62. }
  63. }
  64. }
Correcting teacher:PHPzPHPz

Correction status:qualified

Teacher's comments:
Statement of this Website
The copyright of this blog article belongs to the blogger. Please specify the address when reprinting! If there is any infringement or violation of the law, please contact admin@php.cn Report processing!
All comments Speak rationally on civilized internet, please comply with News Comment Service Agreement
0 comments
Author's latest blog post