Thinkphp5框架实现图片、音频和视频文件的上传功能详解


Posted in PHP onAugust 27, 2019

本文实例讲述了Thinkphp5框架实现图片、音频和视频文件的上传功能。分享给大家供大家参考,具体如下:

首先是同步上传,最为基础的上传的方式,点击表单提交之后跳转那种。如下前端代码

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>上传文件</title>
</head>
<body>
  <form action="upload" enctype="multipart/form-data" method="post">
    <input type="file" name="image" />
    <br>
    <input type="submit" value="上传" />
  </form>
</body>
</html>

注意这里的enctype必须enctype="multipart/form-data",方案必须是post。后端代码直接拿tp5的官网示例代码吧:

public function upload(){
  // 获取表单上传文件 例如上传了001.jpg
  $file = request()->file('image');
  // 移动到框架应用根目录/public/uploads/ 目录下
  if($file){
    $info = $file->move(ROOT_PATH . 'public' . DS . 'uploads');
    if($info){
      // 成功上传后 获取上传信息
      // 输出 jpg
      echo $info->getExtension();
      // 输出 20160820/42a79759f284b767dfcb2a0197904287.jpg
      echo $info->getSaveName();
      // 输出 42a79759f284b767dfcb2a0197904287.jpg
      echo $info->getFilename();
    }else{
      // 上传失败获取错误信息
      echo $file->getError();
    }
  };
 }

后面发现自己做的好简单,于是改进了前端代码,并且前端代码实现了文件类型校验,将同步改为ajax异步提交,同时改为formdata提交文件数据,后台代码没有太大变化,返回了提交文件的链接,而前端预览只能预览图片。改过之后的前端代码为

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>上传文件</title>
</head>
<body>
  <form action="uploads1a" id="myform">
    <input type="file" name="image" id="file" />
  </form>
  <div id="test"></div>
  <button id="btn">点击上传</button>
  <div>
    <img src="" id="see">
  </div>
  <script type="text/javascript">
  var btn = document.getElementById("btn");
  var file=document.getElementById("file");
  var promise=["png","jpg","jpeg","gif","mp3","mp4","svg"];
  file.onchange=function(){
    var name=file.value;
    var ext=name.substring(name.lastIndexOf(".") + 1).toLowerCase();
    var res=promise.indexOf(ext);
    if (res<0) {
      alert("文件格式不正确");
      document.getElementById("btn").disabled=true;
    }else{
      document.getElementById("btn").disabled=false;
    }
  }
  btn.onclick = function() {
    var val=document.getElementById("file").value;
    if (val.length==0) {
      return;
    }
    var fromData = new FormData(document.forms[0]);
    fromData.append("test", "formdata");
    var oAjax = new XMLHttpRequest();
    oAjax.open('post', "uploadAjax", true);
    oAjax.send(fromData);
    oAjax.onreadystatechange = function() {
      if (oAjax.readyState == 4) {
        if (oAjax.status >= 200 && oAjax.status < 300 || oAjax.status == 304) {
          console.log(oAjax.responseText);
          var data=JSON.parse(oAjax.responseText);
          document.getElementById("see").setAttribute("src","/thinkphp"+data.src);
          document.getElementById("file").value="";
        } else {
          console.log(oAjax.status);
        }
      }
    };
  }
  </script>
</body>
</html>

后端代码改进了一下

public function uploadAjax(){
    // 获取表单上传文件 例如上传了001.jpg
  $file = request()->file('image');
  $test=request()->post("test");
  $src=[];//返回文件路径
  // 移动到框架应用根目录/public/uploads/ 目录下
  if($file){
    $info = $file->move(ROOT_PATH . 'public' . DS . 'uploads');
    if($info){
      // 成功上传后 获取上传信息
      // 输出 jpg
       $info->getExtension();
      // 输出 20160820/42a79759f284b767dfcb2a0197904287.jpg
       $info->getSaveName();
      // 输出 42a79759f284b767dfcb2a0197904287.jpg
       $info->getFilename();
       $src["src"]=DS.'public'.DS.'uploads'.DS.$info->getSaveName();
    }else{
      // 上传失败获取错误信息
       $file->getError();
    }
  };
    return json_encode($src);
  }

细节方面,比如上传之后报错返回信息没有做处理。

整体实现就是这样,作为一个常用的业务场景,这个本身还有很多改进的余地,比如删除已经上传的文件或者校验文件是否已经上传,如果上传不能二次上传或者删除掉前面上传的。当然如果文件名称不做处理而是原名称上传,则上传之后会覆盖原文件。

希望本文所述对大家基于ThinkPHP框架的PHP程序设计有所帮助。

PHP 相关文章推荐
php下过滤html代码的函数 提高程序安全性
Mar 02 PHP
在smarty模板中使用PHP函数的方法
Apr 23 PHP
PHP函数preg_match_all正则表达式的基本使用详细解析
Aug 31 PHP
PHP的构造方法,析构方法和this关键字详细介绍
Oct 22 PHP
php旋转图片90度的方法
Nov 07 PHP
php中explode函数用法分析
Nov 15 PHP
php开发工具有哪五款
Nov 09 PHP
微信开发之php表单微信中自动提交两次问题解决办法
Jan 08 PHP
用php+ajax新建流程(请假、进货、出货等)
Jun 11 PHP
使用YII2框架实现微信公众号中表单提交功能
Sep 04 PHP
thinkphp5 框架结合plupload实现图片批量上传功能示例
Apr 04 PHP
Linux系统下安装PHP7.3版本
Jun 26 PHP
Thinkphp5框架使用validate实现验证功能的方法
Aug 27 #PHP
thinkPHP3.2使用RBAC实现权限管理的实现
Aug 27 #PHP
PHP如何将图片文件上传到另外一台服务器上
Aug 26 #PHP
PHP命名空间与自动加载机制的基础介绍
Aug 25 #PHP
php的命名空间与自动加载实现方法
Aug 25 #PHP
PHP7数组的底层实现示例
Aug 25 #PHP
PHP实现cookie跨域session共享的方法分析
Aug 23 #PHP
You might like
PHP与已存在的Java应用程序集成
2006/10/09 PHP
PHP 定界符 使用技巧
2009/06/14 PHP
10个可以简化php开发过程的MySQL工具
2010/04/11 PHP
php在线代理转向代码
2012/05/05 PHP
Linux下手动编译安装PHP扩展的例子分享
2014/07/15 PHP
php中ob_get_length缓冲与获取缓冲长度实例
2014/11/20 PHP
Laravel中unique和exists验证规则的优化详解
2018/01/28 PHP
javascript高亮效果的二种实现方法
2008/09/14 Javascript
Extjs学习笔记之四 工具栏和菜单
2010/01/07 Javascript
将HTMLCollection/NodeList/伪数组转换成数组的实现方法
2011/06/20 Javascript
分享12个实用的jQuery代码片段
2016/03/09 Javascript
使用jQuery Rotare实现微信大转盘抽奖功能
2016/06/20 Javascript
jQuery控制控件文本的长度的操作方法
2016/12/05 Javascript
Node.js log4js日志管理详解
2018/07/31 Javascript
vue车牌号校验和银行校验实战
2019/01/23 Javascript
vue-cli3环境变量与分环境打包的方法示例
2019/02/18 Javascript
webpack 处理CSS资源的实现
2019/09/27 Javascript
[03:15]DOTA2-DPC中国联赛1月22日Recap集锦
2021/03/11 DOTA
让python在hadoop上跑起来
2016/01/27 Python
flask入门之文件上传与邮件发送示例
2018/07/18 Python
python文件拆分与重组实例
2018/12/10 Python
OpenCV HSV颜色识别及HSV基本颜色分量范围
2019/03/22 Python
python pygame实现五子棋小游戏
2020/10/26 Python
浅谈pyqt5在QMainWindow中布局的问题
2019/06/21 Python
css3实现背景图片拉伸效果像桌面壁纸一样
2013/08/19 HTML / CSS
Ray-Ban雷朋西班牙官网:全球领先的太阳眼镜品牌
2018/11/28 全球购物
数控技术与应用毕业生自荐信
2013/09/24 职场文书
社区志愿者心得体会
2014/01/03 职场文书
培训自我鉴定
2014/01/31 职场文书
《狮子和兔子》教学反思
2014/03/02 职场文书
我的中国梦演讲稿500字
2014/08/19 职场文书
初三英语教学计划
2015/01/23 职场文书
2016年小学生清明节广播稿
2015/12/17 职场文书
《自然之道》读后感3篇
2019/12/17 职场文书
python 经纬度求两点距离、三点面积操作
2021/06/03 Python
Java9新特性对HTTP2协议支持与非阻塞HTTP API
2022/03/16 Java/Android