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开发需要注意的安全问题
Sep 01 PHP
php图片处理:加水印、缩略图的实现(自定义函数:watermark、thumbnail)
Dec 02 PHP
php中使用Akismet防止垃圾评论的代码
Jun 10 PHP
PHP基础教程(php入门基础教程)一些code代码
Jan 06 PHP
wamp下修改mysql访问密码的解决方法
May 07 PHP
php采用curl模仿登录人人网发布动态的方法
Nov 07 PHP
thinkphp模板输出技巧汇总
Nov 24 PHP
php+mysql数据库查询实例
Jan 21 PHP
php简单实现MVC
Feb 05 PHP
PHP类和对象相关系统函数与运算符小结
Sep 28 PHP
PHP实现的Redis多库选择功能单例类
Jul 27 PHP
PHP实现的最大正向匹配算法示例
Dec 19 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 使用redis简单示例分享
2015/03/05 PHP
PHP+MYSQL实现读写分离简单实战
2017/03/13 PHP
jQuery 名称冲突的解决方法
2011/04/08 Javascript
关于图片的预加载过程中隐藏未知的
2012/12/19 Javascript
前台js调用后台方法示例
2013/12/02 Javascript
jQuery动态显示和隐藏datagrid中的某一列的方法
2013/12/11 Javascript
javascript计算当月剩余天数(天数计算器)示例代码
2014/01/09 Javascript
使用GruntJS构建Web程序之安装篇
2014/06/04 Javascript
Angular用来控制元素的展示与否的原生指令介绍
2015/01/07 Javascript
jQuery实现菜单感应鼠标滑动动画效果的方法
2015/02/28 Javascript
jquery实现翻动fadeIn显示的方法
2015/03/05 Javascript
使用JQuery实现智能表单验证功能
2016/03/08 Javascript
JavaScript之cookie技术详解
2016/11/18 Javascript
js时间戳和c#时间戳互转方法(推荐)
2017/02/15 Javascript
JS实现的简单拖拽购物车功能示例【附源码下载】
2018/01/03 Javascript
基于Vue 撸一个指令实现拖拽功能
2019/10/09 Javascript
python实现自动登录人人网并采集信息的方法
2015/06/28 Python
python解析html提取数据,并生成word文档实例解析
2018/01/22 Python
Python Paramiko模块的使用实际案例
2018/02/01 Python
Python rstrip()方法实例详解
2018/11/11 Python
Python3实现的旋转矩阵图像算法示例
2019/04/03 Python
Python之修改图片像素值的方法
2019/07/03 Python
在django中自定义字段Field详解
2019/12/03 Python
浅谈ROC曲线的最佳阈值如何选取
2020/02/28 Python
python 解决pycharm运行py文件只有unittest选项的问题
2020/09/01 Python
Python+unittest+requests 接口自动化测试框架搭建教程
2020/10/09 Python
纯HTML5+CSS3制作生日蛋糕代码
2016/11/16 HTML / CSS
input元素的url类型和email类型简介
2012/07/11 HTML / CSS
THE OUTNET英国官网:国际设计师品牌折扣网站
2016/08/14 全球购物
Monnier Freres中文官网:法国领先的奢侈品配饰在线零售商
2017/11/01 全球购物
Web Service面试题:如何搭建Axis2的开发环境
2012/06/20 面试题
检察机关个人对照检查材料
2014/09/15 职场文书
向国旗敬礼活动总结范文2014
2014/09/27 职场文书
有关水浒传的读书笔记
2015/06/25 职场文书
python字符串常规操作大全
2021/05/02 Python
IDEA使用SpringAssistant插件创建SpringCloud项目
2021/06/23 Java/Android