php无刷新文件上传程序代码

 更新时间:2016年11月25日 15:35  点击:2096
文件上传最简单的就是一个表单用户选择图片之后点击上传了,如果希望用户体验好点,我们可以使用ajax或iframe来上传了,下面一起来看一个例子。

在一个网站项目中,为了得到更好的用户体验,很多地方都要处理成异步无刷新的效果。此文件上传范例是利用一个隐藏的框架iframe做桥梁,实现主体页面上传文件无刷新的效果。

其实本范例也不是真正的异步效果,但是也是可以达到无刷新效果的。而且这种方法是实现php无刷新上传文件最快捷,最简单的方法,所以何乐而不为呢。

html代码

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>php实现无刷新文件上传源码-代潇瑞博客</title>
<script type="text/javascript" src="jquery-1.8.0.min.js"></script>
<script type="text/javascript">
 function ajax_upload(fname){
  if(fname){
   $(".label1").html("上传成功:("+fname+")");
   var obj = document.getElementById('upfile');
   obj.outerHTML=obj.outerHTML;
  }else{
   $(".label1").html("上传失败!!");
  }
  $("#upButton").val("上 传").removeAttr("disabled");
 }
 
 function check_file(){
  if($("#upfile").val()==""){
   $(".label1").html("请先选择一个文件!");
   return false;
  }else{
   $("#upButton").val("上传中...").attr("disabled","disabled");
   return true;
  }
 }
</script>
</head>

<body>

<p><input type="text" /></p>

<form action="deal_upload.php" method="post" target="upimgf" enctype="multipart/form-data" onsubmit="return check_file()">
<p>请选择图片:<input type="file" name="img" id="upfile" /></p>
<p><label class="label1" style="color:red;"></label></p>
<p><input type="submit" value="上 传" id="upButton" /></p>
</form>
<iframe name="upimgf" style="display:none;"></iframe>
</body>
</html>


php代码

<?php
 
 header("Content-type:text/html;charset=utf-8");
 
 $up_file = $_FILES['img'];
 $file_name = $up_file['name'];
 //print_r($file_name);
 if(move_uploaded_file($up_file['tmp_name'],iconv("utf-8","gb2312",$file_name))){
  echo "<script> parent.ajax_upload('".$file_name."'); </script>";
 }else{
  echo "<script> parent.ajax_upload(''); </script>";
 }
?>

当然上在这段上传没有做任何的一个安全验证了,我们如果要处理 可以进行一些处理 了。

php实现多图片上传方法非常的简单只要遍历数组然后使用上传函数就可以搞定了,可以说几句代码就可以实现,但对于新手来讲还是有点,下面一起来看看。

在做图片上传时用到了symfony第三方上传库,详见 Symfony2使用第三方库Upload制作图片上传【原创】,但是对于多图片上传怎么处理,这里我用了个笨办法就是把多图片数组转换成单个的图片数组上传!

表单提交如下:


接受的图片信息的数组如下:

 

所以对此做一些处理,单个图片依次上传,如下:

if (isset($_FILES['image']) &&  $_FILES['image']['name']) {
  $file = $_FILES['image'];
  $num = count ($_FILES['image']['name']); //计算上传的图片数量
  // 处理数组
  for ($i=0;$i < $num;$i++) {
    $data[$i]['name'] = $file['name'][$i];
    $data[$i]['type'] = $file['type'][$i];
    $data[$i]['tmp_name'] = $file['tmp_name'][$i];
    $data[$i]['error'] = $file['error'][$i];
    $data[$i]['size'] = $file['size'][$i];
  }
  foreach ($data as $key => $val) {
    $_FILES['image'] = $val;
  
   if(move_uploaded_file($val['name'], './',$val['name'])){
        echo '<img src="'.$path.$image_name.'"  class="preview">';
    }else{
        echo '上传出错了!';
    }

  }
  $info['image'] = serialize($img);   // 序列化数组存数据库
  $conn->insert('maintenance', $info);
}

这算是比较偷懒的做法,有不对的地方还望多多指教!

注意:fileUpload('image')是一个上传类了,各位可以参考下来来看看 move_uploaded_file($value, $savepath);

php是服务器端脚本了并不像js那样有专业的settimeout函数来定时执行了,但只要浏览器不关闭各阶层是可以做到了,下面一起来看看。


下面写个简单例子来讲解这个方法。

<?php
ignore_user_abort();//关闭浏览器仍然执行
set_time_limit(0);//让程序一直执行下去
$interval=3;//每隔一定时间运行
do{
    $msg=date("Y-m-d H:i:s");
    file_put_contents("log.log",$msg,FILE_APPEND);//记录日志
    sleep($interval);//等待时间,进行下一次操作。
}while(true);
?>

需要说明的是:程序没有写结束判断语句,他会无限循环下去。当然如果想停止的话,可以重启apache,重启后就无效了。想再次进行定时执行,那么把这段代码再一次运行。

上面简单例子可以说明这个原理。
那么针对上面的例子,我可以进行一下改良方案。

你需要一个执行脚本的开关,你可以用外部文件引入的方法来实现,在while循环的时候,include开关变量即可。那么就可以这样实现:

建立外部引入变量文件 switch.php 内容如下:

<?php
return 1;//1执行脚本 0退出执行脚本
?>

改良脚本如下:

<?php
    ignore_user_abort();//关闭浏览器后,继续执行php代码
    set_time_limit(0);//程序执行时间无限制
    $sleep_time = 5;//多长时间执行一次
    $switch = include 'switch.php';
    while($switch){
        $switch = include 'switch.php';
        $msg=date("Y-m-d H:i:s").$switch;
            file_put_contents("log.log",$msg,FILE_APPEND);//记录日志
        sleep($sleep_time);//等待时间,进行下一次操作。
    }
    exit();
   
?>


当然我们也可以使用系统的定时执行php脚本了,下面看个linux的例子。

在Crontab中使用PHP执行脚本

就像在Crontab中调用普通的shell脚本一样(具体Crontab用法),使用PHP程序来调用PHP脚本。
每一小时执行myscript.php如下:

# crontab -e
00 * * * * /usr/local/bin/php /home/john/myscript.php

/usr/local/bin/php为PHP程序的路径。

要防止重复提交我们通过需要增加一些额外的一些验证了,像数据库查询或表单的key验证或最简单的jquery事件监控了,下面我们一起来看看。


比如下面的情况就会导致表单重复提交:
点击提交按钮两次。
点击刷新按钮。
使用浏览器后退按钮重复之前的操作,导致重复提交表单。
使用浏览器历史记录重复提交表单。
浏览器重复的HTTP请求。
网页被恶意刷新。

下面是几种解决的方法:

一:利用js设置按钮点击后变成灰色


$(document).ready(function(){
  $(input:submit).click(){
      setTimeout(function(){obj.disabled=true;},100)
  };
});

二:利用session

在session中存放一个特殊标志。当表单页面被请求时,生成一个特殊的字符标志串,存在session中,同时放在表单的隐藏域里。接受处理表单数据时,检查标识字串是否存在,并立即从session中删除它,然后正常处理数据。

如果发现表单提交里没有有效的标志串,这说明表单已经被提交过了,忽略这次提交。

这使你的web应用有了更高级的XSRF保护


加载提交的页面时候,生成一个随机数,
$code = mt_rand(0,1000000);
存储在表单的隐藏输入框中:
< input type="hidden" name="code" value="“>
在接收页面的PHP代码如下:

<?php
session_start();
if(isset($_POST['code'])) { 
    if($_POST['code'] == $_SESSION['code']){
         // 重复提交表单了
    }else{ 
         $_SESSION['code'] =$_POST['code']; //存储code
    } 
}?>

三:利用cookies

原理和session差不多,但是cookies一旦用户浏览器禁用cookies,这功能就失效了


if(isset($_POST['submit'])){
    setcookie("tempcookie","",time()+30); 
    header("Location:".$_SERVER[PHP_SELF]);exit(); 
}
if(isset($_COOKIE["tempcookie"])){ 
    setcookie("tempcookie","",0);echo "您已经提交过表单"; 
}

四:利用header函数跳转

一旦用户点击提交按钮,处理完数据后跳到其他页面

if (isset($_POST['submit'])) {
   header('location:success.php');//处理数据后,转向到其他页面
}
五:利用数据库来添加约束

直接在数据库里添加唯一约束或创建唯一索引,一旦发现用户重复提交了,直接抛出警告或者提示,
或者只处理第一次提交的数据,这是最直接有效的方法,要求前期的数据库设计和架构要考虑周全

六:Post/Redirect/Get模式。

在提交后执行页面重定向,这就是所谓的Post-Redirect-Get (PRG)模式。简言之,当用户提交了表单后,你去执行一个客户端的重定向,转到提交成功信息页面。

if (isset($_POST['action']) && $_POST['action'] == 'submitted') {
//处理数据,如插入数据后,立即转向到其他页面
header('location:submits_success.php');
}

这能避免用户按F5导致的重复提交,而其也不会出现浏览器表单重复提交的警告,也能消除按浏览器前进和后退按导致的同样问题。

,#2002 无法登录 MySQL 服务器错误我们可以判断一个是mysql服务器没有启动或者phpmyadmin中的主机配置有问题,下面一起来看看。
一般情况下,我们在管理Linux VPS服务器网站数据库的时候,大部分会使用PHPMYADMIN面板可视化管理数据库。晚上一网友告知原本可以登录的PHPMYADMIN今天无法登陆,但是网站运营都正常的,登录PHPMYADMIN的时候有出现红色"#2002 无法登录 MySQL 服务器"的错误提示,确定密码和用户是没有问题的。

 

解决登陆phpMyAdmin出现"#2002 无法登录 MySQL 服务器"方法

 

出现问题不要紧,我们去寻找和搜索解决方法,最为直接的方法如下:

 

第一、遍历到我们当前网站环境中PHPMYADMIN文件夹所在的目录

 

第二、找到config.default.php文件

 

第三、更换交换:

 

 代码如下 复制代码

$cfg['Servers'][$i]['host'] = 'localhost';

更换成

$cfg['Servers'][$i]['host'] = '127.0.0.1';

 

第四、保存且替换服务器中的文件,重启MYSQL生效,不重启也可以。

 

最后,我们再登录PHPMYADMIN就可以正常登陆,这里需要注意一个问题,我们在安装网站的时候,配置服务器链接原来是LOCALHOST的,以后需要用127.0.0.1作为服务器链接
[!--infotagslink--]

相关文章

  • php读取zip文件(删除文件,提取文件,增加文件)实例

    下面小编来给大家演示几个php操作zip文件的实例,我们可以读取zip包中指定文件与删除zip包中指定文件,下面来给大这介绍一下。 从zip压缩文件中提取文件 代...2016-11-25
  • Jupyter Notebook读取csv文件出现的问题及解决

    这篇文章主要介绍了JupyterNotebook读取csv文件出现的问题及解决,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2023-01-06
  • Photoshop打开PSD文件空白怎么解决

    有时我们接受或下载到的PSD文件打开是空白的,那么我们要如何来解决这个 问题了,下面一聚教程小伙伴就为各位介绍Photoshop打开PSD文件空白解决办法。 1、如我们打开...2016-09-14
  • C#操作本地文件及保存文件到数据库的基本方法总结

    C#使用System.IO中的文件操作方法在Windows系统中处理本地文件相当顺手,这里我们还总结了在Oracle中保存文件的方法,嗯,接下来就来看看整理的C#操作本地文件及保存文件到数据库的基本方法总结...2020-06-25
  • 解决python 使用openpyxl读写大文件的坑

    这篇文章主要介绍了解决python 使用openpyxl读写大文件的坑,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-13
  • C#实现HTTP下载文件的方法

    这篇文章主要介绍了C#实现HTTP下载文件的方法,包括了HTTP通信的创建、本地文件的写入等,非常具有实用价值,需要的朋友可以参考下...2020-06-25
  • SpringBoot实现excel文件生成和下载

    这篇文章主要为大家详细介绍了SpringBoot实现excel文件生成和下载,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-02-09
  • php无刷新利用iframe实现页面无刷新上传文件(1/2)

    利用form表单的target属性和iframe 一、上传文件的一个php教程方法。 该方法接受一个$file参数,该参数为从客户端获取的$_files变量,返回重新命名后的文件名,如果上传失...2016-11-25
  • Php文件上传类class.upload.php用法示例

    本文章来人大家介绍一个php文件上传类的使用方法,期望此实例对各位php入门者会有不小帮助哦。 简介 Class.upload.php是用于管理上传文件的php文件上传类, 它可以帮...2016-11-25
  • php批量替换内容或指定目录下所有文件内容

    要替换字符串中的内容我们只要利用php相关函数,如strstr,str_replace,正则表达式了,那么我们要替换目录所有文件的内容就需要先遍历目录再打开文件再利用上面讲的函数替...2016-11-25
  • PHP文件上传一些小收获

    又码了一个周末的代码,这次在做一些关于文件上传的东西。(PHP UPLOAD)小有收获项目是一个BT种子列表,用户有权限上传自己的种子,然后配合BT TRACK服务器把种子的信息写出来...2016-11-25
  • jQuery实现简单的文件上传进度条效果

    本文实例讲述了jQuery实现文件上传进度条效果的代码。分享给大家供大家参考。具体如下: 运行效果截图如下:具体代码如下:<!DOCTYPE html><html><head><meta charset="utf-8"><title>upload</title><link rel="stylesheet...2015-11-24
  • AI源文件转photoshop图像变模糊问题解决教程

    今天小编在这里就来给photoshop的这一款软件的使用者们来说下AI源文件转photoshop图像变模糊问题的解决教程,各位想知道具体解决方法的使用者们,那么下面就快来跟着小编...2016-09-14
  • jQuery+PHP发布的内容进行无刷新分页(Fckeditor)

    这篇文章将使用jQuery,并结合PHP,将Fckeditor发布的内容进行分页,并且实现无刷新切换页面。 本文假设你是WEB开发人员,掌握了jQuery和PHP相关知识,并且熟知Fckeditor的配置和使用。...2015-10-23
  • C++万能库头文件在vs中的安装步骤(图文)

    这篇文章主要介绍了C++万能库头文件在vs中的安装步骤(图文),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-02-23
  • Zend studio文件注释模板设置方法

    步骤:Window -> PHP -> Editor -> Templates,这里可以设置(增、删、改、导入等)管理你的模板。新建文件注释、函数注释、代码块等模板的实例新建模板,分别输入Name、Description、Patterna)文件注释Name: 3cfileDescriptio...2013-10-04
  • C#路径,文件,目录及IO常见操作汇总

    这篇文章主要介绍了C#路径,文件,目录及IO常见操作,较为详细的分析并汇总了C#关于路径,文件,目录及IO常见操作,具有一定参考借鉴价值,需要的朋友可以参考下...2020-06-25
  • php文件上传你必须知道的几点

    本篇文章主要说明的是与php文件上传的相关配置的知识点。PHP文件上传功能配置主要涉及php.ini配置文件中的upload_tmp_dir、upload_max_filesize、post_max_size等选项,下面一一说明。打开php.ini配置文件找到File Upl...2015-10-21
  • C#使用StreamWriter写入文件的方法

    这篇文章主要介绍了C#使用StreamWriter写入文件的方法,涉及C#中StreamWriter类操作文件的相关技巧,需要的朋友可以参考下...2020-06-25
  • ant design中upload组件上传大文件,显示进度条进度的实例

    这篇文章主要介绍了ant design中upload组件上传大文件,显示进度条进度的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-10-29