博主信息
博文 48
粉丝 3
评论 1
访问量 45918
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
PHP文件上传原理及错误处理
吴长清
原创
752人浏览过

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. }
批改老师:PHPzPHPz

批改状态:合格

老师批语:
本博文版权归博主所有,转载请注明地址!如有侵权、违法,请联系admin@php.cn举报处理!
全部评论 文明上网理性发言,请遵守新闻评论服务协议
0条评论
作者最新博文
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号

  • 登录PHP中文网,和优秀的人一起学习!
    全站2000+教程免费学