热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

thinkphp无刷新上传+无刷新发布日志

在这个特效横幅的web时代,作为phper也需要跟得上潮流。于是乎,着手研究无刷新上传+无刷新发布日志。对于无刷新提交文字之类,jquery都已经提供了很好的功能。只需要.get.post就可以快速建立一个无刷新提交表单了。但是在文件上传方面,jquery明显遇到

在这个特效横幅的web时代,作为phper也需要跟得上潮流。于是乎,着手研究无刷新上传+无刷新发布日志。 对于无刷新提交文字之类,jquery都已经提供了很好的功能。只需要.get / .post 就可以快速建立一个无刷新提交表单了。但是在文件上传方面,jquery明显遇到

在这个特效横幅的web时代,作为phper也需要跟得上潮流。于是乎,着手研究无刷新上传+无刷新发布日志。

对于无刷新提交文字之类,jquery都已经提供了很好的功能。只需要.get / .post 就可以快速建立一个无刷新提交表单了。但是在文件上传方面,jquery明显遇到难题了(HTML5加强了上传文件功能)。网上有使用iframe这种伪ajax上传文件方式,本文就不在这里讨论了。感兴趣的,可以到开源中国查找。

本文也不讲解thinkphp的无刷新提交日志(不懂的去看官网的示例代码)。主要在无刷新上传 + 无刷新发布日志 整合上。下面的全程讲解,都围绕thinkphp框架为主,原生PHP实现方式也相差不大。

网上比较流行的无刷新上传组建有:swfupload 和uploadify 。我是用uploadify的。

模板代码 index.html:













上传文件和发表文章AJAX示例

重新提交文章

上传 重置上传队列

Action部分代码 IndexAction.php

display();
    }
    /*
    *
    *上传文件
    *
    */
    public function upload(){
        import("ORG.Net.UploadFile");
        $upload = new UploadFile();
        $upload->maxSize  = 10485760 ;
        $upload->allowExts  = array('jpg', 'gif', 'png', 'jpeg');
        $upload->savePath =  'test/';
        if(!$upload->upload()) {
            echo $upload->getErrorMsg();
            exit;
        }else{
            //删除旧文件
            if(session('?savename')){
                if(file_exists('test/'.session('savename'))){
                    unlink('test/'.session('savename'));
                    session('savename',NULL);//清除session记录
                }
            }
            $info =  $upload->getUploadFileInfo();
            session('savename',$info[0]['savename']);
        }
        echo '文件"'.$info[0]['name'].'"上传成功!
重新上传将删除刚才上传的文件。'; } /* * *提交文章 * */ public function add(){ //防止重复提交 if(!session('?insid')){ $test['title'] = $this->input('title','请输入标题'); $test['author'] = $this->input('author','请输入作者名称'); $test['content'] = $this->input('content','请输入内容'); if(!session('?savename')){ $this->error('请选择上传的文件!'); } $test['filename'] = session('savename'); $sql = M('test'); $result = $sql->add($test); if($result !== false){ $last_id = $sql->getLastInsID(); session('insid',$last_id);//设置一个防重复提交的session insid session('savename',NULL);//释放上传文件的session $this->success('文章发表成功!'); }else{ $this->error('文章发表失败,请重新提交'); } }else{ $this->error('请勿重复提交!'); } } /* * *重新提交文章 * */ public function reload(){ if(session('?savename')){//检查用户是否上传了文件。然后点击了重新提交文章。 if(file_exists('test/'.session('savename'))){ unlink('test/'.session('savename')); session('savename',NULL); } }else{ session('savename',NULL);//释放上传文件的session } session('insid',NULL); redirect(/index.php);//重定向 } public function input($name,$erroinfo){ $name = $this->_POST($name,'trim,htmlspecialchars,strip_tags'); if(empty($name)){ $this->error($erroinfo); return ; } return $name; } }

说一下思路:

首先,通常用户是填写好内容后,选择好上传文件后,提交表单到服务后端,后端进行结果返回。因为用到无刷新上传,所以上传会成为第一个提交到后端处理的。
于是,我想到用session来作一个记录。虽然可以通过返回的结果放到隐藏input表单或者隐藏iframe里面,但是这样的做法很不安全。要是用户对表单的内容进行修改了,那么就会记录错误的文件了。在上述代码中,可以看到我有多次验证上传文件的session是否有设置。有则删除旧文件,再释放出来。

接着因为用到ajax提交表单内容,为了避免用户重复点击提交按钮,导致文章重复写入数据库。我使用了一个session来防止用户重复提交。尽管可以用js来讲按钮失效。但是这样的做法是极度不安全的。

最后,当用户再次点击重新提交文章后。会再次对上传文件的session检查一次。因为可能会存在这样的情况:用户提交了上传文件,但是没有点击提交按钮。这样就上传了一个没用文件到服务器了。检查完毕,再释放防止重复写入的session值。这里有一个BUG:就是要是用户直接关闭浏览器,那么文件就无法删除了= =||。这个各位就自己研究方案吧(给点提示:可以做一个判断,用户离开浏览器后,进行文件删除。因为只有上传成功后,上传文件session才是被释放的)。

文章尾部,我有一点疑问:uploadify为什么定义了错误信息后,还是会弹出英文错误的?难道只能直接改源码部分吗?如果你知道如何解决,请帖出代码指点一下我吧。谢过了

演示地址:http://redich.com/paoyapao/test/

下载地址:http://adf.ly/KYOH0

推荐阅读
  • 本文介绍了如何使用jQuery和AJAX来实现动态更新两个div的方法。通过调用PHP文件并返回JSON字符串,可以将不同的文本分别插入到两个div中,从而实现页面的动态更新。 ... [详细]
  • 本文介绍了前端人员必须知道的三个问题,即前端都做哪些事、前端都需要哪些技术,以及前端的发展阶段。初级阶段包括HTML、CSS、JavaScript和jQuery的基础知识。进阶阶段涵盖了面向对象编程、响应式设计、Ajax、HTML5等新兴技术。高级阶段包括架构基础、模块化开发、预编译和前沿规范等内容。此外,还介绍了一些后端服务,如Node.js。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • Java实战之电影在线观看系统的实现
    本文介绍了Java实战之电影在线观看系统的实现过程。首先对项目进行了简述,然后展示了系统的效果图。接着介绍了系统的核心代码,包括后台用户管理控制器、电影管理控制器和前台电影控制器。最后对项目的环境配置和使用的技术进行了说明,包括JSP、Spring、SpringMVC、MyBatis、html、css、JavaScript、JQuery、Ajax、layui和maven等。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
  • Voicewo在线语音识别转换jQuery插件的特点和示例
    本文介绍了一款名为Voicewo的在线语音识别转换jQuery插件,该插件具有快速、架构、风格、扩展和兼容等特点,适合在互联网应用中使用。同时还提供了一个快速示例供开发人员参考。 ... [详细]
  • 高质量SQL书写的30条建议
    本文提供了30条关于优化SQL的建议,包括避免使用select *,使用具体字段,以及使用limit 1等。这些建议是基于实际开发经验总结出来的,旨在帮助读者优化SQL查询。 ... [详细]
  • Ihavethefollowingonhtml我在html上有以下内容<html><head><scriptsrc..3003_Tes ... [详细]
  • 在springmvc框架中,前台ajax调用方法,对图片批量下载,如何弹出提示保存位置选框?Controller方法 ... [详细]
  • 在Android中解析Gson解析json数据是很方便快捷的,可以直接将json数据解析成java对象或者集合。使用Gson解析json成对象时,默认将json里对应字段的值解析到java对象里对应字段的属性里面。然而,当我们自己定义的java对象里的属性名与json里的字段名不一样时,我们可以使用@SerializedName注解来将对象里的属性跟json里字段对应值匹配起来。本文介绍了使用@SerializedName注解解析json数据的方法,并给出了具体的使用示例。 ... [详细]
  • 从零基础到精通的前台学习路线
    随着互联网的发展,前台开发工程师成为市场上非常抢手的人才。本文介绍了从零基础到精通前台开发的学习路线,包括学习HTML、CSS、JavaScript等基础知识和常用工具的使用。通过循序渐进的学习,可以掌握前台开发的基本技能,并有能力找到一份月薪8000以上的工作。 ... [详细]
  • express工程中的json调用方法
    本文介绍了在express工程中如何调用json数据,包括建立app.js文件、创建数据接口以及获取全部数据和typeid为1的数据的方法。 ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
author-avatar
深碍是碍u不是爱
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有