Blogger Information
Blog 12
fans 0
comment 0
visits 11930
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
PHP表单文件的上传解析
張涛的博客
Original
1595 people have browsed it

一、文件上传的原理

文件上传:文件从用户本地电脑通过传输的方式(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. }
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