php文件上传的两种实现方法


Posted in PHP onApril 04, 2016

文件上传一般有下面2种方式:

有两种:
1、标准input表单方式,典型的用$_FILES进行接收;
2、以Base64的方式进行传送,一般是AJAX异步上传。

第一种
标准的input表单方式,适用于大文件进行上传,同时支持批量。html代码关键的几句:

<form enctype="multipart/form-data" method="post" action="upload.php"">
  <input type="file" name="id_pic[]" accept="image/*" class="form-control" multiple />
  <input type="submit" value="上传 " />
</form>

不同的name时:

<form enctype="multipart/form-data" method="post" action="upload.php"">
  <input type="file" name="id_pic_1" accept="image/*" class="form-control" />
  <input type="file" name="id_pic_2" accept="image/*" class="form-control" />
  <input type="submit" value="上传 " />
</form>

其中enctype="multipart/form-data"对于文件上传是必不可少的。另外type="file"设置input类型,accept="image/*"指定优先上传图片(MIME 参考手册)。multiple支持一次选多个文件,pic[]以数组的形式接收多个文件。手机端端还可以加入参数capture="camera"选择摄像头拍照上传。

后端处理:
通过$_FILES获取上传的文件。

$files = $_FILES;
传多个文件时,如果name不同,则返回的$_FILES数组格式不同。

name相同时:

array(1) {
 ["id_pic"] => array(5) {
  ["name"] => array(2) {
   [0] => string(5) "1.jpg"
   [1] => string(5) "2.jpg"
  }
  ["type"] => array(2) {
   [0] => string(10) "image/jpeg"
   [1] => string(10) "image/jpeg"
  }
  ["tmp_name"] => array(2) {
   [0] => string(27) "C:\Windows\Temp\php7A7E.tmp"
   [1] => string(27) "C:\Windows\Temp\php7A7F.tmp"
  }
  ["error"] => array(2) {
   [0] => int(0)
   [1] => int(0)
  }
  ["size"] => array(2) {
   [0] => int(77357)
   [1] => int(56720)
  }
 }
}

name不相同时:

array(2) {
 ["id_pic_1"] => array(5) {
  ["name"] => string(5) "1.jpg"
  ["type"] => string(10) "image/jpeg"
  ["tmp_name"] => string(27) "C:\Windows\Temp\phpBBEE.tmp"
  ["error"] => int(0)
  ["size"] => int(77357)
 }
 ["id_pic_2"] => array(5) {
  ["name"] => string(5) "2.jpg"
  ["type"] => string(10) "image/jpeg"
  ["tmp_name"] => string(27) "C:\Windows\Temp\phpBBEF.tmp"
  ["error"] => int(0)
  ["size"] => int(56720)
 }
}

在对$_FILES进行foreach遍历时,前面那种输出格式不大方便。后面那种就可以直接遍历。我们可以写个方法进行统一转换:

function dealFiles($files) {
    $fileArray = array();
    $n     = 0;
    foreach ($files as $key=>$file){
      if(is_array($file['name'])) {
        $keys    =  array_keys($file);
        $count   =  count($file['name']);
        for ($i=0; $i<$count; $i++) {
          $fileArray[$n]['key'] = $key;
          foreach ($keys as $_key){
            $fileArray[$n][$_key] = $file[$_key][$i];
          }
          $n++;
        }
      }else{
        $fileArray = $files;
        break;
      }
    }
    return $fileArray;
 }

好,前面讲到后端如何处理接收到的$_FILES数组,并转换成统一格式。接下来任务主要是:
1、检测上传的文件是否非法;
2、检测上传的文件是否超过大小;
3、检测保存的路径是否存在,是否可写;
4、文件重命名;

其中上传过程中用到了个很重要的函数:move_uploaded_file(filename , $destination )进行文件移动操作。将$_FILES['id_pic']['tmp_name']移动到新的路径里。当然,移动前可以用is_uploaded_file($_FILES['id_pic']['tmp_name'])进行判断文件是否正常上传的。

多文件上传则是循环的方法多次使用move_uploaded_file()进行移动操作。

第二种
主要以上传图片为主。
利用input的change事件,借助canvas对图片进行处理(例如压缩),然后ajax发送文件流到后端。

基本原理是通过canvas渲染图片,再通过 toDataURL 方法压缩保存为base64字符串(能够编译为jpg格式的图片)。

后端处理:
后端最终会收到前端发送的base64字符串,接着处理字符串为图片即可。具体请使用关键字base64 转 image 开发语言进行谷歌|百度。前端生成的结果中有一个base64Len,这是字符串的长度,后端应该核对以确认是否提交完整。

//php示例:
$img = base64_decode($_POST['img']);
$img = imagecreatefromstring($img);

以上就是本文的全部内容,希望对大家的学习有所帮助。

PHP 相关文章推荐
PHP5 安装方法
Oct 09 PHP
从网上搜到的phpwind 0day的代码
Dec 07 PHP
php class中public,private,protected的区别以及实例分析
Jun 18 PHP
PHP static局部静态变量和全局静态变量总结
Mar 02 PHP
php使用GD创建保持宽高比缩略图的方法
Apr 17 PHP
PHP QRCODE生成彩色二维码的方法
May 19 PHP
PHP 文件锁与进程锁的使用示例
Aug 07 PHP
PHP实现模拟http请求的方法分析
Dec 20 PHP
PHP7.1实现的AES与RSA加密操作示例
Jun 15 PHP
PHP一致性hash分布式算法封装类定义与用法示例
Aug 04 PHP
PHP使Laravel为JSON REST API返回自定义错误的问题
Oct 16 PHP
php版本CKEditor 4和CKFinder安装及配置方法图文教程
Jun 05 PHP
在Win2003(64位)中配置IIS6+PHP5.2.17+MySQL5.5的运行环境
Apr 04 #PHP
PHP版本的选择5.2.17 5.3.27 5.3.28 5.4 5.5兼容性问题分析
Apr 04 #PHP
PHP命名空间和自动加载类
Apr 03 #PHP
PHP中的Trait 特性及作用
Apr 03 #PHP
PHP错误处理函数
Apr 03 #PHP
php通过curl添加cookie伪造登陆抓取数据的方法
Apr 02 #PHP
PHP函数nl2br()与自定义函数nl2p()换行用法分析
Apr 02 #PHP
You might like
php5.3不能连接mssql数据库的解决方法
2014/12/27 PHP
php程序总是提示验证码输入有误解决方案
2015/01/07 PHP
php字符串的替换,分割和连接方法
2016/05/23 PHP
php实现网页端验证码功能
2017/07/11 PHP
PHP上传图片到数据库并显示的实例代码
2019/12/20 PHP
基于php伪静态的实现方法解析
2020/07/31 PHP
Javascript中的变量使用说明
2010/05/18 Javascript
基于jquery实现点击左右按钮图片横向滚动
2013/04/11 Javascript
简单选项卡 js和jquery制作方法分享
2014/02/26 Javascript
JS打开新窗口防止被浏览器阻止的方法
2015/01/03 Javascript
JS实现控制图片显示大小的方法【图片等比例缩放功能】
2017/02/18 Javascript
Bootstrap入门教程一Hello Bootstrap初识
2017/03/02 Javascript
jQuery模拟下拉框选择对应菜单的内容
2017/03/07 Javascript
angular 用拦截器统一处理http请求和响应的方法
2017/06/08 Javascript
Parcel 打包示例(React HelloWorld)
2018/01/16 Javascript
Angular中使用better-scroll插件的方法
2018/03/27 Javascript
JS+canvas画布实现炫酷的旋转星空效果示例
2019/02/13 Javascript
vue双向绑定及观察者模式详解
2019/03/19 Javascript
Vue filter 过滤当前时间 实现实时更新效果
2019/12/20 Javascript
[01:03:36]Ti4 循环赛第三日DK vs Titan
2014/07/12 DOTA
[03:09]2014DOTA2国际邀请赛 赛场上的美丽风景线 中国Coser也爱DOTA2
2014/07/20 DOTA
[55:35]DOTA2-DPC中国联赛 正赛 CDEC vs Dragon BO3 第二场 1月22日
2021/03/11 DOTA
Python计算斗牛游戏概率算法实例分析
2017/09/26 Python
python如何获取当前文件夹下所有文件名详解
2019/01/25 Python
浅析Python3 pip换源问题
2020/01/06 Python
Python获取二维数组的行列数的2种方法
2020/02/11 Python
使用C#编写创建一个线程的代码
2013/01/22 面试题
现在输入n个数字,以逗号,分开;然后可选择升或者降序排序;按提交键就在另一页面显示按什么排序,结果为,提供reset
2012/11/09 面试题
十佳中学生事迹材料
2014/06/02 职场文书
法院反腐倡廉心得体会
2014/09/09 职场文书
村级干部党员公开承诺事项
2015/05/04 职场文书
巴黎圣母院观后感
2015/06/10 职场文书
预备党员表决心的话
2015/09/22 职场文书
数据分析数据库ClickHouse在大数据领域应用实践
2022/04/03 MySQL
CentOS下安装Jenkins的完整步骤
2022/04/07 Servers
win11系统中dhcp服务异常什么意思? Win11 DHCP服务异常修复方法
2022/04/08 数码科技