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读取数据库信息的几种方法
May 24 PHP
php cache类代码(php数据缓存类)
Apr 15 PHP
PHP 时间日期操作实战
Aug 26 PHP
探讨PHP中this,self,parent的区别详解
Jun 08 PHP
PHP入门之常量简介和系统常量
May 12 PHP
PHP实现的汉字拼音转换和公历农历转换类及使用示例
Jul 01 PHP
ThinkPHP惯例配置文件详解
Jul 14 PHP
php 批量查询搜狗sogou代码分享
May 17 PHP
php实现paypal 授权登录
May 28 PHP
php错误日志简单配置方法
Jul 11 PHP
thinkphp 抓取网站的内容并且保存到本地的实例详解
Aug 25 PHP
PHP使用ajax的post方式下载excel文件简单示例
Aug 06 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 和 MySQL 开发的 8 个技巧
2007/01/02 PHP
php xml文件操作实现代码(二)
2009/03/20 PHP
PHP中获取文件扩展名的N种方法小结
2012/02/27 PHP
php配合jquery实现增删操作具体实例
2013/12/12 PHP
PHP折半(二分)查找算法实例分析
2018/05/12 PHP
top.location.href 没有权限 解决方法
2008/08/05 Javascript
最简单的jQuery程序 入门者学习
2009/07/09 Javascript
js本身的局限性 别让javascript做太多事
2010/03/23 Javascript
jquery中输入验证中一个不错的效果
2010/08/21 Javascript
Javascript下判断是否为闰年的Datetime包
2010/10/26 Javascript
Javascript 自适应高度的Tab选项卡
2011/04/05 Javascript
js定时调用方法成功后并停止调用示例
2014/04/08 Javascript
JS控制弹出新页面窗口位置和大小的方法
2015/03/02 Javascript
同步文本框内容JS代码实现
2016/08/04 Javascript
微信小程序 scroll-view隐藏滚动条详解
2017/01/16 Javascript
Node.js使用NodeMailer发送邮件实例代码
2017/03/06 Javascript
angular实现图片懒加载实例代码
2017/06/08 Javascript
详解webpack进阶之loader篇
2017/08/23 Javascript
记一次webapck4 配置文件无效的解决历程
2018/09/19 Javascript
深入了解JavaScript代码覆盖
2019/06/13 Javascript
微信小程序tabBar设置实例解析
2019/11/14 Javascript
基于Angular 8和Bootstrap 4实现动态主题切换的示例代码
2020/02/11 Javascript
vue使用swiper实现左右滑动切换图片
2020/10/16 Javascript
element-ui点击查看大图的方法示例
2020/12/14 Javascript
精确查找PHP WEBSHELL木马的方法(1)
2011/04/12 Python
python 列表降维的实例讲解
2018/06/28 Python
django rest framework vue 实现用户登录详解
2019/07/29 Python
python实现信号时域统计特征提取代码
2020/02/26 Python
Juice Beauty官网:有机美容产品,护肤与化妆品
2020/06/13 全球购物
统计员岗位职责
2013/11/14 职场文书
毕业生入职感言
2015/07/31 职场文书
新年祝酒词大全
2015/08/11 职场文书
60条职场经典语录,总有一条能触动你的心
2019/08/21 职场文书
普希金诗歌赏析(6首)
2019/08/22 职场文书
Navicat连接MySQL错误描述分析
2021/06/02 MySQL
CSS中float高度塌陷问题的四种解决方案
2022/04/18 HTML / CSS