PHP+ajax实现上传、删除、修改单张图片及后台处理逻辑操作详解


Posted in PHP onFebruary 12, 2020

本文实例讲述了PHP+ajax实现上传、删除、修改单张图片及后台处理逻辑操作。分享给大家供大家参考,具体如下:

2019-07-04更新

更新修改原因:

  1. 前台界面ui显示不好看
  2. 后台处理逻辑混乱,涉及到多张图片处理起来很麻烦,所以修改成通过ajax上传/删除图片。

效果:

上传前:
PHP+ajax实现上传、删除、修改单张图片及后台处理逻辑操作详解
上传后:
PHP+ajax实现上传、删除、修改单张图片及后台处理逻辑操作详解
撤销后:
PHP+ajax实现上传、删除、修改单张图片及后台处理逻辑操作详解
以下是更新的代码:

HTML

  • 代码:
<div class="form-group">
 <label for="username" class="col-sm-2 control-label no-padding-right">缩略图   		 </label>
 <div class="col-sm-6">
  <input type="hidden" id="pic" value="" name="pic">
   <!-- 要将父布局的position设置为relative,父布局将无法包裹input -->
   <a href="javascript:void(0);" rel="external nofollow" rel="external nofollow" rel="external nofollow" class="btn btn-palegreen" style="position: relative;margin-right: 10px;" id="xian">
   <!--设置input的position为absolute,使其不按文档流排版,并设置其包裹整个布局 -->
   <!-- 设置opactity为0,使input变透明 -->
   <input type="file" name="pic" accept="image/*" style="opacity: 0;position: absolute">上传图片</a>
   <a href="javascript:void(0);" rel="external nofollow" rel="external nofollow" rel="external nofollow" class="btn btn-magenta" onclick="delimg(this)" style="display: none" id="che">撤销图片</a>
 </div>
</div>

要点: 重点都在注释里了。

参考: JS+HTML实现自定义上传图片按钮并显示图片

JS

  • 代码:
//上传图片
   //对input[type=file]监听
    $("input[name=pic]").on('change',function () {
      var e=$(this);
      var file=e[0].files[0];
      var formData=new FormData();
      formData.append("pic",file);//这里给图片赋的name要与下面php中接收的post值对应
      $.ajax({
       url: "{:url('upimg')}",
        type:'POST',
        cache: false, //上传文件不需要缓存
        data:formData,
        processData: false, // 告诉jQuery不要去处理发送的数据(规定通过请求发送的数据是否转换为查询字符串。默认是 true。)
        contentType: false, // 告诉jQuery不要去设置Content-Type请求头(发送数据到服务器时所使用的内容类型。默认是:"application/x-www-form-urlencoded"。)
        success:function (data) {
          if (data){
            $("#xian").hide();
            $("#che").show();
            $("#pic").val(data);
           e.parents(".col-sm-6").append("[外链图片转存失败(img-wg119lWd-1562224226091)(https://mp.csdn.net/mdeditor/%22+data+%22)]");
            layer.msg('上传成功', {icon: 6})
          } else{
            layer.msg('上传失败', {icon: 5})
          }
        }
      })
    })
    
  //删除图片
  function delimg(e) {
    layer.confirm('确定删除?', {icon: 3, title:'提示'}, function(index){
      //do something
      var id="{$article.id}";
      var imgpath = $(e).siblings('img:last').attr('src');
      $.ajax({
        url:"{:url('delimg')}",
        type:'post',
        data: {pic:imgpath},
        success:function (data) {
          if(data){
            $("#xian").show();
            $("#che").hide();
            $("#pic").val("");
            $(e).siblings('img').hide();
            layer.msg('删除成功', {icon: 6})
          }else{
            layer.msg('删除失败', {icon: 5})
          }
        }
      })
      layer.close(index);
    });
    
  }

这里有句代码展示有问题,源码如下:
PHP+ajax实现上传、删除、修改单张图片及后台处理逻辑操作详解

要点
JS formDate的使用
上传成功后返回图片路径,塞到input[type=hidden]框里,之后会随着表单提交上去,保存在数据库中。

参考: JavaScript实现图片上传并预览并提交ajax

PHP

  • 代码:
//ajax上传图片
 public function upimg()
  {
    $file = request()->file('pic');//这里接收到的图片name要与上面js中formData赋值对应
    if ($file) {
      $info = $file->move(ROOT_PATH . 'public' . DS . 'uploads' . DS . 'articleimg');
      $imgpath = '/uploads/articleimg/' . $info->getSaveName();
      return $imgpath;
    }else{
      return 0;
    }
  }

//ajax删除图片
  public function delimg()
  {
    $data = input('post.');
    if ($pic = $data['pic']) {
      $imppath = ROOT_PATH . 'public' . $pic;
      if (@unlink($imppath)) {
      //这里要对数据库中的Pic字段进行即时修改。嗯嗯
        $re=db('article')->where('id', $data['id'])->setField('pic', '');
        if ($re!==false){
          return 1;
        }
      } else {
        return 0;
      }
    } else {
      return '参数错误';
    }
  }

分割线(下面是前几天写的答案,逻辑混乱。。。就不要看了吧)


  1. 前台处理:
  • 添加一个<input type="hidden" value="" name="pic">,会随着post一起提交到后台中去。
    PHP+ajax实现上传、删除、修改单张图片及后台处理逻辑操作详解
  1. 后台处理分为两步
  • 收到的post数据data中pic字段值为空时,且该栏目之前有图片,则执行删除原来图片操作;
  • 如果上传了新图片,则移动到指定目录下,并查询该栏目之前是否有图片,如果有,则执行删除原来图片操作;
    html代码
<div class="form-group">
  <label for="username"
      class="col-sm-2 control-label no-padding-right">栏目图片</label>
  <div class="col-sm-6">
    <input type="hidden" name="pic" value="{$ca.pic}" id="pic">
    <input type="file" id="file" accept="image/*"
        name="pic" style="display: inline-block">
    <a href="javascript:void(0);" rel="external nofollow" rel="external nofollow" rel="external nofollow" 
      class="btn btn-warning shiny" id="returnimg"><i
        class="menu-icon fa fa-repeat"></i>撤销图片</a>
    {notempty name='$ca.pic'} <img src="{$ca.pic}" alt="图片"
                    id="img"
                    style="width: 50px;margin-top:10px;display: block">
    {else/}
    <img src="" alt="图片" id="img"
       style="width: 50px;margin-top:10px;display: none">
    {/notempty}
  </div>
</div>

js代码

<script>
  //图片撤销
    $("#returnimg").on('click', function () {
      let img = $("#img").attr('src');
      if (img) {
        layer.confirm('确定撤销图片?', {icon: 3, title: '提示'}, function (index) {
           $("#pic").val("");

          $("#img").attr('src', '').css('display', 'none');

          layer.close(index);
        });

      } else {
        layer.msg('未选择图片', {icon: 0});
      }

    })
</script>

php代码

//1.如果栏目原来有图片&&现在撤销了,就删除旧图片
      if (($cate['pic'] != false) && ($data['pic'] == false)) {
        @unlink(ROOT_PATH . 'public' . $cate['pic']);
      }

      //如果上传了新的图片
      $file = request()->file('pic');
      // 移动到框架应用根目录/public/uploads/ 目录下
      if ($file) {
        $info = $file->move(ROOT_PATH . 'public' . DS . 'uploads' . DS . 'cateimg');
        if ($info) {
          // 成功上传后 获取上传信息
          $pic = '/uploads/cateimg/' . $info->getSaveName();
          $data['pic'] = $pic;
          //2.新的图片上传成功后,如果栏目原来有图片,删除原来栏目图片
          if ($cate['pic']) {
            @unlink(ROOT_PATH . 'public' . $cate['pic']);
          }
        } else {
          // 上传失败获取错误信息
          $this->error($file->getError());
        }
      }

更多关于PHP相关内容可查看本站专题:《PHP+ajax技巧与应用小结》、《PHP网络编程技巧总结》、《php字符串(string)用法总结》、《php+mysql数据库操作入门教程》及《php常见数据库操作技巧汇总》

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
php 变量定义方法
Jun 14 PHP
simplehtmldom Doc api帮助文档
Mar 26 PHP
php笔记之:php数组相关函数的使用
Apr 26 PHP
PHP在线生成二维码代码(google api)
Jun 03 PHP
支持中文和其他编码的php截取字符串函数分享(截取中文字符串)
Mar 13 PHP
php调用shell的方法
Nov 05 PHP
php7 安装yar 生成docker镜像
May 09 PHP
PHP批量删除jQuery操作
Jul 23 PHP
php 数据结构之链表队列
Oct 17 PHP
phpcms实现验证码替换及phpcms实现全站搜索功能教程详解
Dec 13 PHP
浅谈php的TS和NTS的区别
Mar 13 PHP
PHP操作XML中XPath的应用示例
Jul 04 PHP
分享8个Laravel模型时间戳使用技巧小结
Feb 12 #PHP
tp5.0框架隐藏index.php入口文件及模块和控制器的方法分析
Feb 11 #PHP
thinkphp5框架路由原理与用法详解
Feb 11 #PHP
php数组指针函数功能及用法示例
Feb 11 #PHP
PHP实现单例模式建立数据库连接的方法分析
Feb 11 #PHP
php-7.3.6 编译安装过程
Feb 11 #PHP
PHP实现Markdown文章上传到七牛图床的实例内容
Feb 11 #PHP
You might like
雄兵连:天使彦天使彦为爱折翼,彦和炙心同时念动的誓言!
2020/03/02 国漫
php ZipArchive压缩函数详解实例
2013/11/06 PHP
Yii输入正确验证码却验证失败的解决方法
2017/06/06 PHP
PHP文件系统管理(实例讲解)
2017/09/19 PHP
用于自动添加Digg This!按钮的JavaScript
2006/12/23 Javascript
JavaScript接口实现代码 (Interfaces In JavaScript)
2010/06/11 Javascript
高性能WEB开发 flush让页面分块,逐步呈现 flush让页面分块,逐步呈现
2010/06/19 Javascript
jQuery+.net实现浏览更多内容(改编php版本)
2013/03/28 Javascript
Javascript selection的兼容性写法介绍
2013/12/20 Javascript
javascript操作excel生成报表全攻略
2014/05/04 Javascript
javascript实现Table间隔色以及选择高亮(和动态切换数据)的方法
2015/05/14 Javascript
js弹出对话框方式小结
2015/11/17 Javascript
js实现StringBuffer的简单实例
2016/09/02 Javascript
使用Node.js给图片加水印的方法
2016/11/15 Javascript
angular5 httpclient的示例实战
2018/03/12 Javascript
Vue弹出菜单功能的实现代码
2018/09/12 Javascript
layui关闭层级、简单监听的实例
2019/09/06 Javascript
echarts实现折线图的拖拽效果
2019/12/19 Javascript
vue中template的三种写法示例
2020/10/21 Javascript
JavaScript中常用的3种弹出提示框(alert、confirm、prompt)
2020/11/10 Javascript
[38:40]2018DOTA2亚洲邀请赛 4.6淘汰赛 mineski vs LGD 第一场
2018/04/10 DOTA
python 输出一个两行字符的变量
2009/02/05 Python
在Python中使用__slots__方法的详细教程
2015/04/28 Python
利用aardio给python编写图形界面
2017/08/21 Python
Python3使用turtle绘制超立方体图形示例
2018/06/19 Python
python中pickle模块浅析
2020/12/29 Python
HTML5 本地存储 LocalStorage详解
2016/06/24 HTML / CSS
钉钉企业内部H5微应用开发详解
2020/05/12 HTML / CSS
英国最大的天然和有机产品在线零售商之一:Big Green Smile
2020/05/06 全球购物
厨师岗位职责
2013/11/12 职场文书
销售工作岗位职责
2013/12/24 职场文书
如何写你的创业计划书
2014/01/07 职场文书
公务员中国梦演讲稿
2014/08/19 职场文书
2014年人力资源工作总结
2014/11/19 职场文书
回门宴新娘答谢词
2015/09/29 职场文书
深入浅析Django MTV模式
2021/09/04 Python