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 相关文章推荐
Extended CHM PHP 语法手册之 DIY
Oct 09 PHP
玩转虚拟域名◎+ .
Oct 09 PHP
php GeoIP的使用教程
Mar 09 PHP
php读取富文本的时p标签会出现红线是怎么回事
May 13 PHP
PHP资源管理框架Assetic简介
Jun 12 PHP
ThinkPHP中自定义错误页面和提示页面实例
Nov 22 PHP
PHP正则表达式之捕获组与非捕获组
Nov 06 PHP
调试WordPress中定时任务的相关PHP脚本示例
Dec 10 PHP
Zend Framework教程之配置文件application.ini解析
Mar 10 PHP
100行PHP代码实现socks5代理服务器
Apr 28 PHP
php通过执行CutyCapt命令实现网页截图的方法
Sep 30 PHP
完美解决在ThinkPHP控制器中命名空间的问题
May 05 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
咖啡与水的关系
2021/03/03 冲泡冲煮
PHP图片裁剪函数(保持图像不变形)
2014/05/04 PHP
使用PHP进行微信公众平台开发的示例
2015/08/21 PHP
限制文本框输入N个字符的js代码
2010/05/13 Javascript
Ext对基本类型的扩展 ext,extjs,format
2010/12/25 Javascript
最常用的12种设计模式小结
2011/08/09 Javascript
jquery struts 验证唯一标识(公用方法)
2013/03/27 Javascript
JS实现超简单的仿QQ折叠菜单效果
2015/09/21 Javascript
详解JavaScript函数
2015/12/01 Javascript
基于canvas实现的绚丽圆圈效果完整实例
2016/01/26 Javascript
常用的js验证和数据处理总结
2016/08/02 Javascript
浅谈vue+webpack项目调试方法步骤
2017/09/11 Javascript
基于Bootstrap框架菜鸟入门教程(推荐)
2017/09/17 Javascript
你可能不知道的前端算法之文字避让(inMap)
2018/01/12 Javascript
Bootstrap开发中Tab标签页切换图表显示问题的解决方法
2018/07/13 Javascript
Vue中的作用域CSS和CSS模块的区别
2018/10/09 Javascript
Layui数据表格之单元格编辑方式
2019/10/26 Javascript
JS中队列和双端队列实现及应用详解
2020/09/29 Javascript
[01:14]2019完美世界城市挑战赛(秋季赛)全国总决赛精彩花絮
2020/01/08 DOTA
python解析文件示例
2014/01/23 Python
python遍历数组的方法小结
2015/04/30 Python
Python使用multiprocessing创建进程的方法
2015/06/04 Python
Python入门_浅谈逻辑判断与运算符
2017/05/16 Python
python的staticmethod与classmethod实现实例代码
2018/02/11 Python
详解python项目实战:模拟登陆CSDN
2019/04/04 Python
Django 表单模型选择框如何使用分组
2019/05/16 Python
python操作文件的参数整理
2019/06/11 Python
pandas 选取行和列数据的方法详解
2019/08/08 Python
通过selenium抓取某东的TT购买记录并分析趋势过程解析
2019/08/15 Python
python 画条形图(柱状图)实例
2020/04/24 Python
CSS图片翻转动画技术详解(IE也实现了)
2014/04/03 HTML / CSS
不用游标的SQL语句有哪些
2012/09/07 面试题
新闻报道策划方案
2014/06/11 职场文书
党的群众路线对照检查材料
2014/08/27 职场文书
银行反四风对照检查材料
2014/09/29 职场文书
MySQL sql_mode修改不生效的原因及解决
2021/05/07 MySQL