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 结果集的分页实现代码
Mar 10 PHP
php curl常见错误:SSL错误、bool(false)
Dec 28 PHP
PHP利用str_replace防注入的方法
Nov 10 PHP
ThinkPHP空模块和空操作详解
Jun 30 PHP
php去除字符串中空字符的常用方法小结
Mar 17 PHP
网页的分页下标生成代码(PHP后端方法)
Feb 03 PHP
php简单备份与还原MySql的方法
May 09 PHP
php查找字符串中第一个非0的位置截取
Feb 27 PHP
PHP实现绘制二叉树图形显示功能详解【包括二叉搜索树、平衡树及红黑树】
Nov 16 PHP
php 读写json文件及修改json的方法
Mar 07 PHP
Yii框架日志操作图文与实例详解
Sep 09 PHP
aec加密 php_php aes加密解密类(兼容php5、php7)
Mar 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
一个显示效果非常不错的PHP错误、异常处理类
2014/03/21 PHP
ThinkPHP使用心得分享-上传类UploadFile的使用
2014/05/15 PHP
php结合curl实现多线程抓取
2015/07/09 PHP
PHP获取某个月最大天数(最后一天)的方法
2015/07/29 PHP
PHP实现的线索二叉树及二叉树遍历方法详解
2016/04/25 PHP
Joomla数据库操作之JFactory::getDBO用法
2016/05/05 PHP
网页禁用右键实现代码(JavaScript代码)
2009/10/29 Javascript
JSQL 基于客户端的成绩统计实现方法
2010/05/05 Javascript
用jQuery中的ajax分页实现代码
2011/09/20 Javascript
javascript中onmouse事件在div中失效问题的解决方法
2012/01/09 Javascript
js禁止页面刷新禁止用F5键刷新禁止右键的示例代码
2013/09/23 Javascript
JS实现静止元素自动移动示例
2014/04/14 Javascript
javascript框架设计读书笔记之数组的扩展与修复
2014/12/02 Javascript
浅谈javascript语法和定时函数
2015/05/03 Javascript
浏览器环境下JavaScript脚本加载与执行探析之defer与async特性
2016/01/14 Javascript
Node.js批量给图片加水印的方法
2016/11/15 Javascript
正则表达式基本语法及表单验证操作详解【基于JS】
2017/04/07 Javascript
mac下的nodejs环境安装的步骤
2017/05/24 NodeJs
Angular实现的日程表功能【可添加及隐藏显示内容】
2017/12/27 Javascript
微信小程序用户信息encryptedData详解
2018/08/24 Javascript
javascript中toFixed()四舍五入使用方法详解
2018/09/28 Javascript
BootStrap modal实现拖拽功能
2018/12/01 Javascript
微信小程序事件对象中e.target和e.currentTarget的区别详解
2019/05/08 Javascript
Vue 请求传公共参数的操作
2020/07/31 Javascript
electron踩坑之dialog中的callback解决
2020/10/06 Javascript
Python中暂存上传图片的方法
2015/02/18 Python
python操作mongodb根据_id查询数据的实现方法
2015/05/20 Python
Python数据分析库pandas基本操作方法
2018/04/08 Python
使用PyTorch实现MNIST手写体识别代码
2020/01/18 Python
Python模块zipfile原理及使用方法详解
2020/08/04 Python
PyCharm 2020.2.2 x64 下载并安装的详细教程
2020/10/15 Python
数据库方面面试题
2012/04/22 面试题
保护环境建议书400字
2014/05/13 职场文书
党支部特色活动方案
2014/08/20 职场文书
医者仁心观后感
2015/06/17 职场文书
MySQL系列之八 MySQL服务器变量
2021/07/02 MySQL