PHP表单文件的上传解析

2020年07月27日 11:33:11阅读数:121博客 / 張涛的博客 / PHP

一、文件上传的原理

文件上传:文件从用户本地电脑通过传输的方式(web表单)保存到服务器所在电脑指定的目录

1、文件上传的步骤

  • 1.增加文件上传的表单:浏览器请求一个服务器的HTML脚本(包含文件上传表单)

  • 2.用户从本地选择一个文件(点击上传框(按钮))

  • 3.用户点击上传,文件会通过物联网传输到服务器上

  • 4.服务器操作系统会将文件保存到临时目录下,是以临时文件的格式保存(windows下的tmp文件夹)

  • 5.服务器脚本开始工作:判断文件有效

  • 6.服务器脚本将有效文件从临时目录下移动到指定的目录下

二、HTML的表单要求

  • 1.form标签的method属性必须是POST

  • 2.form标签的enctype属性主要是规范表单数据的编码方式。在使用文件上传时,属性值必须时’multipart/form-data’

  • 3.上传表单:file表单

三、PHP处理文件上传

在PHP中,有一个预定义变量$_FILES是专门用来存储用户上传的文件的

1、$_FILES变量

$_FILES变量是专门用来接收文件上传的。使用$_POST是接收不到文件信息的。

1.$_FILES变量是以一个数组的形式来接收文件的

  • name:文件在用户(浏览器端)电脑上实际存在的名字

  • tmp_name:文件上传到服务器端临时存放时的路径

  • type:MIME(多功能互联网邮件扩展)类型,用来在计算机中客户端识别文件的类型格式

  • error:文件上传的代号。用来告知PHP文件接收过程中出现了什么样的问题(PHP后期根据代码进行文件判断)

  • size:文件大小(PHP根据实际需求来确定是否该保留)

2、移动临时文件到目标位置

文件上传之后会保存到$_FILES中,那么访问文件信息的形式就是$_FILES[表单name属性值][元素信息]

1.判断是否为上传的文件:临时文件

is_uploaded_file()

  1. //取得文件信息
  2. $file = $_FILES['image'];
  3. //判断是否是上传文件:临时文件
  4. if(is_uploaded_file($file['tmp_name'])){
  5. //是上传文件
  6. }else{
  7. //不是上传文件
  8. }

2.移动文件

move_uploaded_file(‘临时文件路径’,’要移动的目录下的文件名’)

  1. //是上传文件
  2. if(move_uploaded_file($file['tmp_name'],'uploads'.$file['name'])){
  3. //文件保存成功
  4. }else {
  5. //文件保存失败
  6. }

注意: 第二个参数要是一个有效的目录地址,目录必须存在;要带有文件名称,不能是纯路径。

3、多文件上传

1.当商品需要上传多个图片进行展示时,那么需要使用多文件上传。即针对一个内容进行多个文件上传:同名表单

2.当商品需要进行多维度图片说明时,需要使用多文件上传。即针对不同内容进行多个文件上传:批量解决问题

1.同名表单

HTML页面

input的name属性使用数组的形式。

  1. <form action="" enctype="multipart/form-data">
  2. 文件上传:<input type="file" name="img[]"><br>
  3. 文件上传:<input type="file" name="img[]"><br>
  4. 文件上传:<input type="file" name="img[]"><br>
  5. <button type="submit">提交</button>
  6. </form>

PHP后台实现

将表单名字形成一个数组,同时将文件对应的五个要素都单独形成一个数组。每一个文件上传对用的数组元素的下标都是一样的

  1. //判断元素存在而且是数组
  2. if (isset($_FILES['image']['name']) && is_array($_FILES['image']['name'])) {
  3. //遍历构造数组元素
  4. $images = array(); //存放所有的文件信息,一个元素代表一个文件(数组)
  5. foreach($_FILES['image']['name'] as $k=>$file){
  6. $images[] = array(
  7. 'name'=>$file,
  8. 'tmp_name'=>$_FILES['image']['tmp_name'][$k],
  9. 'type'=>$_FILES['image']['type'][$k],
  10. 'error'=>$_FILES['image']['error'][$k],
  11. 'size'=>$_FILES['image']['size'][$k]
  12. );
  13. }
  14. }
  15. //此时的images数组就和不同name属性值的上传方式一样了

2.批量上传

HTML页面

input的name属性不同。

  1. <form action="" enctype="multipart/form-data">
  2. 文件上传:<input type="file" name="body"><br>
  3. 文件上传:<input type="file" name="head"><br>
  4. 文件上传:<input type="file" name="foot"><br>
  5. <button type="submit">提交</button>
  6. </form>

PHP后台实现

每个文件都会形成一个属于自己独立的5个元素的数组

  1. foreach($_FILES as $file){
  2. //$file就是一个完整的上传文件信息:找到临时路径,指定存放路径
  3. if(is_uploaded_file($file['tmp_name'])){
  4. move_uploaded_file($file['tmp_name'],'upload/'.$file['name']);
  5. }
  6. }

3、封装成方法,并使用五个元素对文件的上传进行判断

  1. $file = $_FILES['file_1'];
  2. $path = 'img/';
  3. $allow_type = array("image");
  4. $allow_format = array("jpeg");
  5. $max_size = 10000000;
  6. if ($filename = upload_file($file, $path, $error, $allow_type, $allow_format, $max_size)) {
  7. echo '文件保存成功!';
  8. echo $filename . '.' . 'jpeg';
  9. } else {
  10. echo $error;
  11. }
  12. /**
  13. * @param $file 通过$_FILES接受的文件数组
  14. * @param $path 文件要保存的地址
  15. * @param $error 方法返回的错误信息
  16. * @param $allow_type 方法允许的文件类型
  17. * @param $allow_format 方法允许的文件格式
  18. * @param $max_size 方法允许的文件大小
  19. * @return
  20. */
  21. function upload_file($file, $path, &$error, $allow_type, $allow_format, $max_size)
  22. {
  23. //1.判断文件是否有效
  24. if (!isset($file['name']) || !is_array($file)) {
  25. $error = "不是一个有效文件!";
  26. return false;
  27. }
  28. //判断保存文件路径是否有效
  29. if (!is_dir($path)) {
  30. $error = "文件存储路径不存在!";
  31. return false;
  32. }
  33. //判断文件本身上传过程中是否有错误
  34. switch ($file['error']) {
  35. case 1:
  36. case 2:
  37. $error = "文件大小超过服务器允许大小!";
  38. return false;
  39. case 3:
  40. $error = "文件上传有损,上传失败!";
  41. return false;
  42. case 4:
  43. case 6:
  44. $error = "没有找到文件!";
  45. return false;
  46. case 7:
  47. $error = "文件写入失败!";
  48. return false;
  49. }
  50. //判断MIME类型
  51. $mime = strstr($file['type'], "/", TRUE);
  52. if (!in_array($mime, $allow_type)) {
  53. $error = "文件类型有误!";
  54. return false;
  55. }
  56. //判断文件格式是否正确
  57. $type = ltrim(strstr($file['type'], '/'), '/');
  58. if (!in_array($type, $allow_format)) {
  59. $error = "文件格式有误!";
  60. return false;
  61. }
  62. //判断当前文件大小是否满足当前需求
  63. if ($file["size"] > $max_size) {
  64. $error = "文件过大!";
  65. return false;
  66. }
  67. //构造文件名字:类型_年月日+随机字符串 .$ext
  68. $filename = $mime . '_' . date("Ymd");
  69. //移动到指定目录
  70. if (is_uploaded_file($file["tmp_name"])) {
  71. if (move_uploaded_file($file['tmp_name'], $path . "/" . $filename . '.' . $type)) {
  72. return $filename;
  73. }
  74. } else {
  75. $error = "文件保存失败!";
  76. return false;
  77. }
  78. }

全部评论

文明上网理性发言,请遵守新闻评论服务协议

条评论
  • 博主信息
    張涛的博客
    博文
    12
    粉丝
    0
    评论
    0
    访问量
    1535
    积分:1
    P豆:68