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.ini 中文版
Oct 28 PHP
调试一段PHP程序时遇到的三个问题
Jan 17 PHP
PHP下使用CURL方式POST数据至API接口的代码
Feb 14 PHP
php echo, print, print_r, sprintf, var_dump, var_expor的使用区别
Jun 20 PHP
解析PHP实现下载文件的两种方法
Jul 05 PHP
PHP5.3安装Zend Guard Loader图文教程
Sep 29 PHP
php实现简单爬虫的开发
Mar 28 PHP
PHP面向对象自动加载机制原理与用法分析
Oct 14 PHP
PHP面向对象程序设计之命名空间与自动加载类详解
Dec 02 PHP
php获取ip及网址的简单方法(必看)
Apr 01 PHP
PHP二维数组实现去除重复项的方法【保留各个键值】
Dec 21 PHP
php实现数字补零的方法总结
Sep 12 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
dedecms防止FCK乱格式化你的代码的修改方法
2007/03/17 PHP
phpmyadmin 访问被拒绝的真实原因
2009/06/15 PHP
PHP提示Notice: Undefined variable的解决办法
2012/11/24 PHP
解析VS2010利用VS.PHP插件调试PHP的方法
2013/07/19 PHP
用PHP和Shell写Hadoop的MapReduce程序
2014/04/15 PHP
php实现简单的MVC框架实例
2015/09/23 PHP
PHP两种实现无级递归分类的方法
2017/03/02 PHP
Extjs入门之动态加载树代码
2010/04/09 Javascript
Struts2的s:radio标签使用及用jquery添加change事件
2013/04/08 Javascript
在Firefox下js select标签点击无法弹出
2014/03/06 Javascript
JavaScript及jquey实现多个数组的合并操作
2014/09/06 Javascript
Jquery对象和Dom对象的区别分析
2014/11/20 Javascript
Jquery实现瀑布流布局(备有详细注释)
2015/07/31 Javascript
seajs模块之间依赖的加载以及模块的执行
2016/10/21 Javascript
JavaScript动态检验密码强度的实现方法
2016/11/09 Javascript
AngularJS Select(选择框)使用详解
2017/01/18 Javascript
JS判断一个数是否是水仙花数
2017/06/11 Javascript
基于vue2框架的机器人自动回复mini-project实例代码
2017/06/13 Javascript
Angular.js前台传list数组由后台spring MVC接收数组示例代码
2017/07/31 Javascript
vue解决跨域路由冲突问题思路解析
2017/11/03 Javascript
微信小程序实现图片上传、删除和预览功能的方法
2017/12/18 Javascript
Vue CLI 2.x搭建vue(目录最全分析)
2019/02/27 Javascript
vue进入页面时滚动条始终在底部代码实例
2019/03/26 Javascript
微信小程序绑定手机号获取验证码功能
2019/10/22 Javascript
JavaScript组合设计模式--改进引入案例分析
2020/05/23 Javascript
[46:50]Liquid vs Mineski 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
python错误:AttributeError: 'module' object has no attribute 'setdefaultencoding'问题的解决方法
2014/08/22 Python
Python删除空文件和空文件夹的方法
2015/07/14 Python
python opencv实现图片旋转矩形分割
2018/07/26 Python
Python pandas用法最全整理
2019/08/04 Python
自定义Django_rest_framework_jwt登陆错误返回的解决
2020/10/18 Python
Top Villas美国:豪华别墅出租和度假屋
2018/07/10 全球购物
澳大利亚著名的纺织品品牌:Canningvale
2020/05/05 全球购物
离婚协议书怎么写
2014/09/12 职场文书
道歉信怎么写
2015/05/12 职场文书
使用Navicat Premium工具将oracle数据库迁移到MySQL
2021/05/27 Oracle