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

PHP表单文件的上传解析

2020年07月27日 11:33:11阅读数:137博客 / 張涛的博客/ 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. }

全部评论

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

条评论
  • 这篇章主要介绍了PHP实现、多个、多函数封装,结合实例形式详细分php原理及针对函数封装相关操作技巧,需要朋友可以参考下。
    php名乱码决办法:首先在php头部加入代码为“header("Content-type: text/html; charset=utf-8");”;然后定义一个变量
    php找不到临时方法:首先打开php.ini配置;然后找到“upload_tmp_dir =”这一行;最后将其改为“upload_tmp_dir = "C:/Windows
    “java”中实现方法是:首先配置参数,接着请求内容,提取数据,然后迭代数据,处理不在字段,接着定义存放路径和完整路径,最后保存到硬盘即可。
    创建一个,允许用户从是非常有用。本讲述了php如何实现到服务器功能。
    PHP改名方法:首先新建一个html,并创建form;然后新建Php用于接收form递过来数据,并设置编码为utf8;接着创建保存目录变量【$store_dir
    php限制类型方法:新建一个,在中设置允许类型,然后通过explode和end函数将后缀名提取出来,判断它后缀是不是我们允许类型。
    “java”实现图片至服务器方法是:首先设置缓冲区大小和临时目录,并设置大小限制,然后请求对象得到内容“List”对象,判断其是否是,接着调用“write()”方法将内容写入即可
    php错误类型有:1、UPLOAD_ERR_OK,其值为0示没有错误发生,成功;2、UPLOAD_ERR_INI_SIZE,其值为1超过了upload_max_filesize
    php图片无法显示决方法:把图片到数据库然后显示做法是专门写一个php页面, php可以通过到数据库,通过GET或POST方法获取图片id、查询数据库、header函数输出图片类型
    php实现方法:1、创建和file类型input并将属性“enctype”设置为“multipart/form-data”;2、在php程序中通过“move_uploaded_file
    php设置大小方法:首先找到并打开“php.ini”配置;然后设置允许通过HTTP开关;接着找到“upload_max_filesize”项并修改大小最大值;最后设置POST
    php失败决办法:首先打开“php.ini”;然后查找“post_max_size”,并修改大小限制;接着查找“file uploads”,并修改开关限制;最后修改临时限制即可
    php实现图片功能方法:首先创建php脚本;然后通过超全局变量“$_FILES”来获取图片;再调用“move_uploaded_file()”函数将图片保存;最后在前端页面创建将图片提交过来即可
    PHP fastcgi模式大出现500错误决办法:首先找到并打开“php.ini”;然后找到“upload_max_filesize”;最后修改大小并重启apache即可
    php不生效决办法:1、时存放临时目录必须是开启,并且是PHP进程所有者用户可写目录;2、【max_execution_time】值必须足够大。
    HTML数据不到PHP原因:1、HTMLaction属性设置错误,没有对应到PHP中;2、HTML提交方式method必须对应PHP那边接收方式;3、PHP接收参数方法出错。
    这篇章主要介绍了JS可断点续实现代码,中通过示例代码介绍非常详细,对大家学习或者工作具有一定参考学习价值,需要朋友可以参考下
    最近在使用帝国CMS时候,发现了一个问题:在或图片时候,一次性不能超过20个,如果超过20个也只能成功20个,其余均失败
    phpcms图片方法:首先在模板页,使用script和link标签引入js和css;然后在页面中添加form;最后增加一个类型为button输入框用来触发即可。