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代码把全角数字转为半角数字
Dec 10 PHP
php代码收集表单内容并写入文件的代码
Jan 29 PHP
PHP number_format() 函数定义和用法
Jun 01 PHP
使用php+apc实现上传进度条且在IE7下不显示的问题解决方法
Apr 25 PHP
关于PHP session 存储方式的详细介绍
Jun 25 PHP
ioncube_loader_win_5.2.dll的错误解决方法
Jan 04 PHP
微信公众平台之快递查询功能用法实例
Apr 14 PHP
windows8.1下Apache+Php+MySQL配置步骤
Oct 30 PHP
开启PHP Static 关键字之旅模式
Nov 13 PHP
PHP开发中AJAX技术的简单应用
Dec 11 PHP
简要剖析PHP的Yii框架的组件化机制的基本知识
Mar 17 PHP
cakephp2.X多表联合查询join及使用分页查询的方法
Feb 23 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
yii2分页之实现跳转到具体某页的实例代码
2016/06/02 PHP
PHP生成短网址的思路以及实现方法的详解
2019/03/25 PHP
PHP CURL中传递cookie的方法步骤
2019/05/09 PHP
Jquery知识点二 jquery下对数组的操作
2011/01/15 Javascript
jQuery hover 延时器实现代码
2011/03/12 Javascript
JQuery自适应IFrame高度(支持嵌套 兼容IE,ff,safafi,chrome)
2011/03/28 Javascript
Jquery中offset()和position()的区别分析
2015/02/05 Javascript
js实现TAB切换对应不同颜色的代码
2015/08/31 Javascript
javascript每日必学之循环
2016/02/19 Javascript
jQuery绑定事件的几种实现方式
2016/05/09 Javascript
jQuery判断是否存在滚动条的简单方法
2016/09/17 Javascript
DataTables+BootStrap组合使用Ajax来获取数据并且动态加载dom的方法(排序,过滤,分页等)
2016/11/09 Javascript
Vue中this.$router.push参数获取方法
2018/02/27 Javascript
vue2.0 根据状态值进行样式的改变展示方法
2018/03/13 Javascript
浅谈手写node可读流之流动模式
2018/06/01 Javascript
element vue Array数组和Map对象的添加与删除操作
2018/11/14 Javascript
Bootstrap4 gulp 配置详解
2019/01/06 Javascript
vue-cli脚手架打包静态资源请求出错的原因与解决
2019/06/06 Javascript
JS代码触发事件代码实例
2020/01/02 Javascript
javascript实现简易计算器功能
2020/09/23 Javascript
Openlayers学习之地图比例尺控件
2020/09/28 Javascript
使用C#配合ArcGIS Engine进行地理信息系统开发
2016/02/19 Python
利用Anaconda完美解决Python 2与python 3的共存问题
2017/05/25 Python
Python函数式编程
2017/07/20 Python
Python实现的视频播放器功能完整示例
2018/02/01 Python
Python Pandas批量读取csv文件到dataframe的方法
2018/10/08 Python
python使用magic模块进行文件类型识别方法
2018/12/08 Python
pygame实现俄罗斯方块游戏(AI篇1)
2019/10/29 Python
用Python做一个久坐提醒小助手的示例代码
2020/02/10 Python
情人节寄语大全
2014/04/11 职场文书
开展批评与自我批评发言材料
2014/05/15 职场文书
行政主管岗位职责
2015/02/03 职场文书
公务员年度考核登记表个人总结
2015/02/12 职场文书
导游词之山东八大关
2019/12/18 职场文书
ajax请求前端跨域问题原因及解决方案
2021/10/16 Javascript
使用CSS实现小三角边框原理解析
2021/11/07 HTML / CSS