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如何编写易读的代码
Jul 10 PHP
五个PHP程序员工具
May 26 PHP
php与php MySQL 之间的关系
Jul 17 PHP
Smarty Foreach 使用说明
Mar 23 PHP
PHP实现下载功能的代码
Sep 29 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(十)
Jun 24 PHP
php检测数组长度函数sizeof与count用法
Nov 17 PHP
Yii中CArrayDataProvider和CActiveDataProvider区别实例分析
Mar 02 PHP
PHP数组相加操作及与array_merge的区别浅析
Nov 26 PHP
php workerman定时任务的实现代码
Dec 23 PHP
Laravel框架实现文件上传的方法分析
Sep 29 PHP
PHP实现二维数组(或多维数组)转换成一维数组的常见方法总结
Dec 04 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
Javascript中的数学函数
2007/04/04 Javascript
jquery photoFrame 图片边框美化显示插件
2010/06/28 Javascript
JavaScript 创建运动框架的实现代码
2013/05/08 Javascript
js中parseInt函数浅谈
2013/07/31 Javascript
js Date概念详细介绍
2013/11/22 Javascript
js通过元素class名字获取元素集合的具体实现
2014/01/06 Javascript
js如何判断用户是否是用微信浏览器
2014/06/05 Javascript
JavaScript中消除闭包的一般方法介绍
2015/03/16 Javascript
jQuery获取标签文本内容和html内容的方法
2015/03/27 Javascript
jQuery实现首页图片淡入淡出效果的方法
2015/06/10 Javascript
举例详解JavaScript中Promise的使用
2015/06/24 Javascript
JavaScript预解析及相关技巧分析
2016/04/21 Javascript
JS实现的多张图片轮流播放幻灯片效果
2016/07/22 Javascript
微信小程序日期时间选择器使用方法
2018/02/01 Javascript
Node.js学习之内置模块fs用法示例
2020/01/22 Javascript
js实现烟花特效
2020/03/02 Javascript
python中实现php的var_dump函数功能
2015/01/21 Python
Python中有趣在__call__函数
2015/06/21 Python
PyCharm中代码字体大小调整方法
2019/07/29 Python
Python使用matplotlib实现交换式图形显示功能示例
2019/09/06 Python
python实现单张图像拼接与批量图片拼接
2020/03/23 Python
python print 格式化输出,动态指定长度的实现
2020/04/12 Python
python matplotlib:plt.scatter() 大小和颜色参数详解
2020/04/14 Python
Python urllib3软件包的使用说明
2020/11/18 Python
使用HTML5的Notification API制作web通知的教程
2015/05/08 HTML / CSS
美国大型的健身社区和补充商店:Bodybuilding.com
2016/09/06 全球购物
美国知名生活购物网站:Goop
2017/11/03 全球购物
数据库笔试题
2013/05/09 面试题
我的求职择业计划书
2014/04/04 职场文书
2015年毕业生实习评语
2015/03/25 职场文书
学历证明样本
2015/06/16 职场文书
小学毕业感言100字
2015/07/30 职场文书
2016猴年春节问候语
2015/11/11 职场文书
《我要的是葫芦》教学反思
2016/02/18 职场文书
python tkinter Entry控件的焦点移动操作
2021/05/22 Python
使用Ajax实现无刷新上传文件
2022/04/12 Javascript