php+html5实现无刷新图片上传教程


Posted in PHP onJanuary 22, 2016

本篇向大家介绍一种全新的上传图片的方式,利用html5的FileReader读取图片文件,然后将数据传输到服务器再使用PHP进行处理。实现过程如下(带图片预览功能)
前端html代码 upload,html

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title>上传</title>
<script type="text/javascript" src="js/jquery.min.js"></script>
<style>
.upload{
  width:300px;
  height:200px;
  position:relative;
}
.upload input[type='file']{
  position:absolute;
  width:70px;
  top:0;
  left:0;
  z-index:10;
  opacity:0;
  filter:alpha(opacity=0);
}
.upload input.selbutton{
  width:70px;
  height:30px;
  background:#cf001b;
  color:#FFF;
  font-size:14px;
  position:absolute;
  top:0;left:0;
  z-index:9;
  border:none;
  cursor:pointer;
}
.upload input.upbutton{
  width:70px;
  height:30px;
  background:#cf001b;
  color:#FFF;
  font-size:14px;
  position:absolute;
  top:50px;left:0;
  z-index:10;
  border:none;
  cursor:pointer;
}
</style>
</head>
<body>
<div class='upload'>
  <input type="file" name="file" />
  <input type="button" name="selbutton" class="selbutton" value="选择文件" />
  <input type="button" name="upbutton" class="upbutton" value="上传" />
</div>
<div class='previews'>
  <img src="#" class="image_thumb" alt="图片预览"/>
</div>
</body>
</html>

样式如下图

php+html5实现无刷新图片上传教程

接下来是js代码

<script type="text/javascript">
  $(".upbutton").click(function(){
    //定义允许上传的图片格式 在前台就可以直接判断,不合法的格式将不会上传
   var filetype = ['jpg','jpeg','png','gif'];
   if($('.image').get(0).files){
      fi = $('.image').get(0).files[0]; //得到文件信息
      //判断文件格式是否是图片 如果不是图片则返回false
      var fname = fi.name.split('.');
      if(filetype.indexOf(fname[1].toLowerCase()) == -1){
        alert('文件格式不支持');
        return ;
      }
      //实例化h5的fileReader
      var fr = new FileReader();
      fr.readAsDataURL(fi); //以base64编码格式读取图片文件
      fr.onload = function(frev){
        pic = frev.target.result; //得到结果数据
      //开始上传之前,预览图片
 $('.image_thumb').attr('src',pic);
//使用ajax 利用post方式提交数据
        $.post(
          'handle.php',
          {
             message:pic,
            filename:fname[0],
            filetype:fname[1],
            filesize:fi.size
          },
          function(data){
            data = eval('('+data+')');
            if(data.code == 1 || data.code == 2){
              console.log('上传失败')
            }else if(data.code == 0){
              console.log('上传成功')
            }
          }
        );
      }
    }
  })
</script>

接下来是PHP处理代码  handle.php

$imgtype = array(
  'gif'=>'gif',
  'png'=>'png',
  'jpg'=>'jpeg',
  'jpeg'=>'jpeg'
); //图片类型在传输过程中对应的头信息
$message = $_POST['message']; //接收以base64编码的图片数据
$filename = $_POST['filename']; //接收文件名称
$ftype = $_POST['filetype']; //接收文件类型
//首先将头信息去掉,然后解码剩余的base64编码的数据
$message = base64_decode(substr($message,strlen('data:image/'.$imgtype[strtolower($ftype)].';base64,')));
$filename = $filename.".".$ftype;
$furl = "D:/now/";
//开始写文件
$file = fopen($furl.$filename,"w");
if(fwrite($file,$message) === false){
  echo json_encode(array('code'=>1,'con'=>'failed'));
  exit;
}
echo json_encode(array('code'=>0,'con'=>$filename));

选择文件然后点击上传的效果如下图

php+html5实现无刷新图片上传教程

以上就是整个图片上传的代码。当然对于PHP的部分还有很多可以优化的地方,比如文件名部分,可以重命名,以保证相同文件名上传以后的文件名是不同的等等。这种上传方式我也是刚开始使用,当初是受Node.js做上传的的启发,然后尝试着应用于PHP,没想到还真能上传成功。

希望大家也可以按照此方法实现图片上传。

PHP 相关文章推荐
用PHP实现验证码功能
Oct 09 PHP
cmd下运行php脚本
Nov 25 PHP
解析php中array_merge与array+array的区别
Jun 21 PHP
50个PHP程序性能优化的方法
Jun 02 PHP
php5.3以后的版本连接sqlserver2000的方法
Jul 28 PHP
使用YUI+Ant 实现JS CSS压缩
Sep 02 PHP
PHP统计数值数组中出现频率最多的10个数字的方法
Apr 20 PHP
php验证码的制作思路和实现方法
Nov 12 PHP
Centos 6.5系统下编译安装PHP 7.0.13的方法
Dec 19 PHP
thinkPHP5框架设置404、403等http状态页面的方法
Jun 05 PHP
PHP Redis扩展无法加载的问题解决方法
Aug 22 PHP
通过实例解析PHP数据类型转换方法
Jul 11 PHP
PHP中的随机性 你觉得自己幸运吗?
Jan 22 #PHP
PHP中的session安全吗?
Jan 22 #PHP
PHP下载远程图片并保存到本地方法总结
Jan 22 #PHP
PHP连接MYSQL数据库实例代码
Jan 20 #PHP
CodeIgniter配置之autoload.php自动加载用法分析
Jan 20 #PHP
Twig模板引擎用法入门教程
Jan 20 #PHP
CodeIgniter控制器之业务逻辑实例分析
Jan 20 #PHP
You might like
给多个地址发邮件的类
2006/10/09 PHP
php UTF8 文件的签名问题
2009/10/30 PHP
php中JSON的使用方法
2015/04/30 PHP
php 判断过去离现在几年的函数(实例代码)
2016/11/15 PHP
laravel框架路由分组,中间件,命名空间,子域名,路由前缀实例分析
2020/02/18 PHP
PHP程序员简单的开展服务治理架构操作详解(二)
2020/05/14 PHP
Firefox/Chrome/Safari的中可直接使用$/$$函数进行调试
2012/02/13 Javascript
可恶的ie8提示缺少id未定义
2014/03/20 Javascript
查找页面中所有类为test的结点的方法
2014/03/28 Javascript
Javascript控制input输入时间格式的方法
2015/01/28 Javascript
JS打字效果的动态菜单代码分享
2015/08/21 Javascript
JS将滑动门改为选项卡(需鼠标点击)的实现方法
2015/09/27 Javascript
Jquery attr()方法 属性赋值和属性获取详解
2016/04/15 Javascript
JavaScript中的原型继承基础学习教程
2016/05/06 Javascript
chrome下判断点击input上标签还是其余标签的实现方法
2016/09/18 Javascript
jQuery输入框密码的显示隐藏【代码分享】
2017/04/29 jQuery
jQuery 开发之EasyUI 添加数据的实例
2017/09/26 jQuery
vue组件通信传值操作示例
2019/01/08 Javascript
JS实现的Object数组去重功能示例【数组成员为Object对象】
2019/02/01 Javascript
Python学习思维导图(必看篇)
2017/06/26 Python
Python利用sqlacodegen自动生成ORM实体类示例
2019/06/04 Python
python查看数据类型的方法
2019/10/12 Python
Python变量、数据类型、数据类型转换相关函数用法实例详解
2020/01/09 Python
python实现ssh及sftp功能(实例代码)
2020/03/16 Python
支持IE8的纯css3开发的响应式设计动画菜单教程
2014/11/05 HTML / CSS
CSS3模拟动画下拉菜单效果
2017/04/12 HTML / CSS
详解css position 5种不同的值的用法
2019/07/30 HTML / CSS
Laura Mercier官网:彩妆大师罗拉玛斯亚的化妆品牌
2018/01/04 全球购物
怎样在 Applet 中建立自己的菜单(MenuBar/Menu)?
2012/06/20 面试题
市场营销专业毕业生求职信
2014/07/21 职场文书
暑假安全教育广播稿
2014/09/10 职场文书
合作合同协议书范本
2015/01/27 职场文书
2015年公司行政后勤工作总结
2015/05/20 职场文书
预备党员半年考察意见
2015/06/01 职场文书
钢琴师观后感
2015/06/12 职场文书
团队拓展训练心得体会
2016/01/12 职场文书