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 相关文章推荐
在Zeus Web Server中安装PHP语言支持
Oct 09 PHP
NT IIS下用ODBC连接数据库
Oct 09 PHP
PHP学习笔记 IIS7下安装配置php环境
Oct 29 PHP
php 字符串压缩方法比较示例
Jan 23 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(十五)
Jun 30 PHP
ThinkPHP框架任意代码执行漏洞的利用及其修复方法
Jul 04 PHP
WIN8.1下搭建PHP5.6环境
Apr 29 PHP
PHP的Laravel框架结合MySQL与Redis数据库的使用部署
Mar 21 PHP
php中array_unshift()修改数组key注意事项分析
May 16 PHP
laravel 5.3中自定义加密服务的方案详解
May 09 PHP
TP5框架model常见操作示例小结【增删改查、聚合、时间戳、软删除等】
Apr 05 PHP
Laravel服务容器绑定的几种方法总结
Jun 14 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/10/09 PHP
php计算程序运行时间的简单例子分享
2014/05/10 PHP
php结合js实现点击超链接执行删除确认操作
2014/10/31 PHP
php实现将数组转换为XML的方法
2015/03/09 PHP
php统计数组不同元素的个数的实例方法
2019/09/26 PHP
使用laravel和ajax实现整个页面无刷新的操作方法
2019/10/03 PHP
说说掌握JavaScript语言的思想前提想学习js的朋友可以看看
2009/04/01 Javascript
jQuery中die()方法用法实例
2015/01/19 Javascript
jquery获取css的color值返回RGB的方法
2015/12/18 Javascript
JavaScript DOM节点操作方法总结
2016/08/23 Javascript
AngularJs 指令详解及示例代码
2016/09/01 Javascript
原生javascript实现的ajax异步封装功能示例
2016/11/03 Javascript
Vue引入jquery实现平滑滚动到指定位置
2018/05/09 jQuery
javascript 设计模式之组合模式原理与应用详解
2020/04/08 Javascript
[03:53]2016国际邀请赛中国区预选赛第三日TOP10精彩集锦
2016/06/29 DOTA
[35:29]Secret vs VG 2018国际邀请赛淘汰赛BO3 第三场 8.23
2018/08/24 DOTA
Python实现获取邮箱内容并解析的方法示例
2018/06/16 Python
python爬取个性签名的方法
2018/06/17 Python
详解Django项目中模板标签及模板的继承与引用(网站中快速布置广告)
2019/03/27 Python
Python3+OpenCV2实现图像的几何变换(平移、镜像、缩放、旋转、仿射)
2019/05/13 Python
canvas实现扭蛋机动画效果的示例代码
2018/10/17 HTML / CSS
写出SQL四条最基本的数据操作语句(DML)
2012/12/12 面试题
广州喜创信息技术有限公司JAVA软件工程师笔试题
2012/10/17 面试题
前台领班岗位职责
2013/12/04 职场文书
校园之声广播稿
2014/01/31 职场文书
鲜花方阵解说词
2014/02/13 职场文书
社会公德演讲稿
2014/05/20 职场文书
法律专业求职信
2014/05/24 职场文书
庆国庆国旗下讲话稿2014
2014/09/21 职场文书
行政执法队伍作风整顿剖析材料
2014/10/11 职场文书
保证书格式
2015/01/16 职场文书
开学第一周日记(三篇范文)
2019/08/23 职场文书
python xlwt模块的使用解析
2021/04/13 Python
Pytorch中Softmax与LogSigmoid的对比分析
2021/06/05 Python
python之基数排序的实现
2021/07/26 Python
Python保存并浏览用户的历史记录
2022/04/29 Python