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利用header函数实现文件下载时直接提示保存
Nov 12 PHP
php各种编码集详解和以及在什么情况下进行使用
Sep 11 PHP
表格展示无限级分类(PHP版)
Aug 21 PHP
PHP代码保护--Zend Guard的使用详解
Jun 03 PHP
php之XML转数组函数的详解
Jun 07 PHP
用 Composer构建自己的 PHP 框架之使用 ORM
Oct 30 PHP
php单例模式实现方法分析
Mar 14 PHP
PHP结合Mysql数据库实现留言板功能
Mar 04 PHP
PHP 二维关联数组根据其中一个字段排序(推荐)
Apr 04 PHP
PHP实现广度优先搜索算法(BFS,Broad First Search)详解
Sep 16 PHP
PHP PDOStatement::bindParam讲解
Jan 30 PHP
PHP html_entity_decode()函数讲解
Feb 25 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获取本地图片文件并生成xml文件输出具体思路
2013/04/27 PHP
PHP实现登录搜狐广告获取广告联盟数据的方法【附demo源码】
2016/10/14 PHP
简单解决微信文章图片防盗链问题
2016/12/17 PHP
php实现购物车功能(以大苹果购物网为例)
2017/03/09 PHP
总结一些PHP中好用但又容易忽略的小知识
2017/06/02 PHP
PHP与以太坊交互详解
2018/08/24 PHP
js操作CheckBoxList实现全选/反选(在客服端完成)
2013/02/02 Javascript
javascript实现TreeView 无刷新展开的实例代码
2013/07/13 Javascript
js 文本滚动效果的实例代码
2013/08/17 Javascript
jquery 页眉单行信息滚动显示实现思路及代码
2014/06/26 Javascript
MVVM模式中ViewModel和View、Model有什么区别?
2015/06/19 Javascript
javascript框架设计之框架分类及主要功能
2015/06/23 Javascript
jQuery头像裁剪工具jcrop用法实例(附演示与demo源码下载)
2016/01/22 Javascript
javascript实现下雪效果【实例代码】
2016/05/03 Javascript
早该知道的7个JavaScript技巧
2016/06/21 Javascript
jQuery根据name属性进行查找的用法分析
2016/06/23 Javascript
javascript实现简易计算器
2017/02/01 Javascript
JS中的作用域链
2017/03/01 Javascript
JavaScript实现三级联动菜单效果
2017/08/16 Javascript
nodejs图片处理工具gm用法小结
2018/12/12 NodeJs
js变量值传到php过程详解 将php解析成数据
2019/06/26 Javascript
Python中集合的内建函数和内建方法学习教程
2015/08/19 Python
python实现贪吃蛇小游戏
2020/03/21 Python
Python实现的读取文件内容并写入其他文件操作示例
2019/04/09 Python
检测python爬虫时是否代理ip伪装成功的方法
2019/07/12 Python
windows下python虚拟环境virtualenv安装和使用详解
2019/07/16 Python
Django框架模型简单介绍与使用分析
2019/07/18 Python
python录音并调用百度语音识别接口的示例
2020/12/01 Python
Python调用高德API实现批量地址转经纬度并写入表格的功能
2021/01/12 Python
html5调用app分享功能示例(WebViewJavascriptBridge)
2018/03/21 HTML / CSS
伦敦新晋轻奢耳饰潮牌:Tada & Toy
2020/05/25 全球购物
如何开启linux的ssh服务
2015/02/14 面试题
本科生详细的自我评价
2013/09/19 职场文书
党支部对转正的意见
2015/06/02 职场文书
如何写好活动总结
2019/06/21 职场文书
MySQL派生表联表查询实战过程
2022/03/20 MySQL