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 相关文章推荐
解析PayPal支付接口的PHP开发方式
Nov 28 PHP
php安全配置 如何配置使其更安全
Dec 16 PHP
通过php修改xml文档内容的方法
Jan 23 PHP
php递归删除指定文件夹的方法小结
Apr 20 PHP
php使用APC实现实时上传进度条功能
Oct 26 PHP
双冒号 ::在PHP中的使用情况
Nov 05 PHP
必须收藏的23个php实用代码片段
Feb 02 PHP
php中关于长度计算容易混淆的问题分析
May 27 PHP
详谈PHP面向对象中常用的关键字和魔术方法
Feb 04 PHP
Laravel中10个有用的用法小结
May 06 PHP
php使用redis的几种常见操作方式和用法示例
Feb 20 PHP
PHP7生产环境队列Beanstalkd用法详解
May 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
让你的网站首页自动选择语言转跳
2006/12/06 PHP
56.com视频采集接口程序(PHP)
2007/09/22 PHP
phpmyadmin里面导入sql语句格式的大量数据的方法
2010/06/05 PHP
《PHP编程最快明白》第六讲:Mysql数据库操作
2010/11/01 PHP
php画图实例
2014/11/05 PHP
详解WordPress中创建和添加过滤器的相关PHP函数
2015/12/29 PHP
thinkPHP5框架中widget的功能与用法详解
2018/06/11 PHP
用jquery方法操作radio使其默认选项是否
2013/09/10 Javascript
node.js中的fs.chmod方法使用说明
2014/12/18 Javascript
如何编写高质量JS代码(续)
2015/02/25 Javascript
javascript中对变量类型的判断方法
2015/08/09 Javascript
jQuery 判断是否包含在数组中Array[]的方法
2016/08/03 Javascript
基于rem的移动端响应式适配方案(详解)
2017/07/07 Javascript
js 发布订阅模式的实例讲解
2017/09/10 Javascript
浅谈webpack性能榨汁机(打包速度优化)
2019/01/09 Javascript
JavaScript中this函数使用实例解析
2020/02/21 Javascript
解决angular 使用原生拖拽页面卡顿及表单控件输入延迟问题
2020/04/21 Javascript
jQuery实现tab栏切换效果
2020/12/22 jQuery
Python中的高级函数map/reduce使用实例
2015/04/13 Python
python django事务transaction源码分析详解
2017/03/17 Python
Python创建对称矩阵的方法示例【基于numpy模块】
2017/10/12 Python
使用Python操作excel文件的实例代码
2017/10/15 Python
python验证码识别教程之灰度处理、二值化、降噪与tesserocr识别
2018/06/04 Python
python3学习之Splash的安装与实例教程
2018/07/09 Python
Python基于机器学习方法实现的电影推荐系统实例详解
2019/06/25 Python
python的一些加密方法及python 加密模块
2019/07/11 Python
python FTP批量下载/删除/上传实例
2019/12/22 Python
python 解决print数组/矩阵无法完整输出的问题
2020/02/19 Python
Python ArgumentParse的subparser用法说明
2020/04/20 Python
Pycharm如何导入python文件及解决报错问题
2020/05/10 Python
numba提升python运行速度的实例方法
2021/01/25 Python
2015年安全员工作总结范文
2015/04/22 职场文书
十月围城观后感
2015/06/08 职场文书
创业计划书之校园跑腿公司
2019/09/24 职场文书
Python实现PIL图像处理库绘制国际象棋棋盘
2021/07/16 Python
Spark SQL 2.4.8 操作 Dataframe的两种方式
2021/10/16 SQL Server