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:风雨欲来 路在何方?
Oct 09 PHP
PHP 中文处理技巧
Apr 25 PHP
PHP中输出转义JavaScript代码的实现代码
Apr 22 PHP
解析php中static,const与define的使用区别
Jun 18 PHP
php导入导出excel实例
Oct 25 PHP
php判断ip黑名单程序代码实例
Feb 24 PHP
php一行代码获取文件后缀名实例分析
Nov 12 PHP
PHP中的traits实现代码复用使用实例
May 13 PHP
PHP上传图片、删除图片简单实例
Nov 12 PHP
laravel在中间件内生成参数并且传递到控制器中的2种姿势
Oct 15 PHP
PHP call_user_func和call_user_func_array函数的简单理解与应用分析
Nov 25 PHP
PHP之header函数详解
Mar 02 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中的一些数组排序方法分享
2012/07/20 PHP
CodeIgniter框架URL路由总结
2014/09/03 PHP
php封装一个异常的处理类
2017/06/08 PHP
使用YII2框架实现微信公众号中表单提交功能
2017/09/04 PHP
yii框架结合charjs统计上一年与当前年数据的方法示例
2020/04/04 PHP
JavaScript 事件参考手册
2008/12/24 Javascript
使用js在页面中绘制表格核心代码
2013/09/16 Javascript
JS中表单的使用小结
2014/01/11 Javascript
禁止iframe页面的所有js脚本如alert及弹出窗口等
2014/09/03 Javascript
jQuery中:empty选择器用法实例
2014/12/30 Javascript
JavaScript实现的简单烟花特效代码
2015/10/20 Javascript
Bootstrap中的Panel和Table全面解析
2016/06/13 Javascript
jQuery实现智能判断固定导航条或侧边栏的方法
2016/09/04 Javascript
超详细的5个Shell脚本实例分享(值得收藏)
2019/08/15 Javascript
JS寄快递地址智能解析的实现代码
2020/07/16 Javascript
Vue点击切换Class变化,实现Active当前样式操作
2020/07/17 Javascript
Python采用socket模拟TCP通讯的实现方法
2014/11/19 Python
Python实现将DOC文档转换为PDF的方法
2015/07/25 Python
浅谈Python peewee 使用经验
2017/10/20 Python
python 接口返回的json字符串实例
2018/03/27 Python
解决pycharm界面不能显示中文的问题
2018/05/23 Python
python 在指定范围内随机生成不重复的n个数实例
2019/01/28 Python
Django框架 信号调度原理解析
2019/09/04 Python
python selenium循环登陆网站的实现
2019/11/04 Python
Django重设Admin密码过程解析
2020/02/10 Python
python遍历路径破解表单的示例
2020/11/21 Python
python爬虫scrapy框架的梨视频案例解析
2021/02/20 Python
法学毕业生自荐信
2013/11/13 职场文书
物流仓管员岗位职责
2013/12/04 职场文书
教师实习自我鉴定
2013/12/11 职场文书
新闻发布会主持词
2014/03/28 职场文书
金融系应届毕业生求职信
2014/05/26 职场文书
保护动物的标语
2014/06/11 职场文书
大学生暑期实践报告
2015/07/13 职场文书
MySQL系列之十五 MySQL常用配置和性能压力测试
2021/07/02 MySQL
IIS服务器中设置HTTP重定向访问HTTPS
2022/04/29 Servers