PHP页面跳转与跨站提交伪造Referer地址来源

 更新时间:2016年11月25日 16:21  点击:1667
本文章来给大家介绍二种利用php来实现页面跳转与跨站提交伪造Referer地址来源具体实现,方法主要用到了fsockopen,curl两个函数,有需要了解的朋友可进入参考。

一、尝试过的URL跳转方法

 代码如下 复制代码

echo '<meta http-equiv="refresh" content="0; URL='.$url.'">';

echo '<scrīpt language="Javascrīpt">window.location.href="'.$url.'";</scrīpt>';

echo '<script language="Javascrīpt">window.location.replace="'.$url.'";</ script>';

以上三种方法均无法传递REFERER地址。

二、使用PHP Socket函数伪造REFER
下面是PHP伪造REFERER代码部分,经过测试可以实现REFERER地址传递,其中$url是输入地址。

 代码如下 复制代码

$uinfo = parse_url($url);//解析URL地址,比如http://111cn.net/archives/1.html

if($uinfo['path']) //

    $data = $uinfo['path'];//这里得到/archives/1.html

else

    $data = '/';//默认根

if(!$fsp = @fsockopen($uinfo['host'], (($uinfo['port']) ? $uinfo['port'] : "80"), $errno, $errstr, 12)){

    echo "对不起对方网站暂时无法打开,请您稍后访问:".$uinfo['host'];    exit;

}else{

    fputs($fsp, "GET “.$data .” HTTP/1.0rn");//如果是跨站POST提交,可使用POST方法

    fputs($fsp, "Host: ".$uinfo['host']."rn");

    fputs($fsp, "Referer: 111cn.netrn");//伪造REFERER地址

    fputs($fsp, "User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)rnrn");

    $res='';

    while(!feof($fsp))  {

        $res.=fgets($fsp, 128);

        if(strstr($res,"200 OK")) {

            header("Location:$url"); exit;

        }

    }

}

//如果是301或302状态码可以继续处理

//返回地址大概形式:HTTP/1.1 301 Moved PermanentlynContent-Length: 164nContent-Type: text/htmlnLocation: http://111cn.net/

$arr=explode("n",$res);

$arr=explode(": ",$arr[3]);//Location后面是真实重定向地址

header("location:".$arr[0]);//跳转目标地址

exit;


利用另一种方法 curl)伪造HTTP_REFERER

 代码如下 复制代码

//PHP(前提是装了curl):
$ch = curl_init();
curl_setopt ($ch, CURLOPT_URL, "http://www.111cn.net/");
curl_setopt ($ch, CURLOPT_REFERER, "http://www.111cn.net/");
curl_exec ($ch);
curl_close ($ch);

//PHP(不装curl用sock)
$server = 'blog.qita.in';
$host      = 'blog.qita.in';
$target    = '/xxx.asp';
$referer = 'http://www.baidu.com/';      // Referer
$port      = 80;
$fp = fsockopen($server, $port, $errno, $errstr, 30);
if (!$fp)
{
     echo "$errstr ($errno)<br />n";
}
else
{
          $out = "GET $target HTTP/1.1rn";
          $out .= "Host: $hostrn";
          $out .= "Cookie: ASPSESSIONIDSQTBQSDA=DFCAPKLBBFICDAFMHNKIGKEGrn";
          $out .= "Referer: $refererrn";
          $out .= "Connection: Closernrn";
          fwrite($fp, $out);
          while (!feof($fp))
          {
                  echo fgets($fp, 128);
          }
          fclose($fp);
}

本文章来给大家介绍一个jQuery+Ajax+PHP实现“喜欢”评级功能代码,用户点击页面中自己喜欢的图片上的红心按钮时,前端页面向后台发送一个ajax请求,后台PHP程序接收请求后,查询IP库中是否已经有该用户的点击记录,如果没有,则将对应的数值+1,同时将该用户IP信息写入IP库,反之则告诉用户已经“喜欢过了”。


数据库设计

先准备两张表,pic表保存的是图片信息,包括图片对应的名称、路径以及图片“喜欢”总数,pic_ip则记录用户点击喜欢后的IP数据。

CREATE TABLE IF NOT EXISTS `pic` ( 
  `id` int(11) NOT NULL AUTO_INCREMENT, 
  `pic_name` varchar(60) NOT NULL, 
  `pic_url` varchar(60) NOT NULL, 
  `love` int(11) NOT NULL DEFAULT '0', 
  PRIMARY KEY (`id`) 
) ENGINE=MyISAM  DEFAULT CHARSET=utf8; 
 
CREATE TABLE IF NOT EXISTS `pic_ip` ( 
  `id` int(11) NOT NULL AUTO_INCREMENT, 
  `pic_id` int(11) NOT NULL, 
  `ip` varchar(40) NOT NULL, 
  PRIMARY KEY (`id`) 
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 

 

index.php

在index.php中,我们通过PHP读取pic表中的图片信息并展示出来,结合CSS,提升页面展示效果。

 代码如下 复制代码

<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8">
<meta name="keywords" content="jquery">
<meta name="description" content="">
<title>jQuery+Ajax+PHP实现"喜欢"评级</title>
<link rel="stylesheet" type="text/css" href="../css/main.css" />
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>
<script type="text/javascript">
$(function(){
$("p a").click(function(){
var love = $(this);
var id = love.attr("rel");
love.fadeOut(300);
$.ajax({
type:"POST",
url:"love.php",
data:"id="+id,
cache:false,
success:function(data){
love.html(data);
love.fadeIn(300);
}
});
return false;
});
});
</script>
<style type="text/css">
.clear{clear:both}
.list{width:760px; margin:20px auto}
.list li{float:left; width:360px; height:280px; margin:10px; position:relative}
.list li p{position:absolute; top:0; left:0; width:360px; height:24px; line-height:24px; background:#000; opacity:.8;filter:alpha(opacity=80);}
.list li p a{padding-left:30px; height:24px; background:url(images/heart.png) no-repeat 4px -1px;color:#fff; font-weight:bold; font-size:14px}
.list li p a:hover{background-position:4px -25px;text-decoration:none}
</style>
</head>

<body>

<div id="main">

<ul class="list">
<?php
include_once("connect.php");
$sql = mysql_query("select * from pic");
while($row=mysql_fetch_array($sql)){
$pic_id = $row['id'];
$pic_name = $row['pic_name'];
$pic_url = $row['pic_url'];
$love = $row['love'];
?>
<li><img src="images/<?php echo $pic_url;?>" alt="<?php echo $pic_name;?>"><p><a href="#" title="我喜欢" class="img_on" rel="<?php echo $pic_id;?>"><?php echo $love;?></a></p></li>
<?php }?>
</ul>

</div>

</body>
</html>

CSS中,我们将定义鼠标滑向和离开红心按钮的动态效果,并定位按钮的位置。

 代码如下 复制代码

.list{width:760px; margin:20px auto} 
.list li{float:left; width:360px; height:280px; margin:10px; position:relative} 
.list li p{position:absolute; top:0; left:0; width:360px; height:24px; line-height:24px;  
background:#000; opacity:.8;filter:alpha(opacity=80);} 
.list li p a{padding-left:30px; height:24px; background:url(images/heart.png) no-repeat  
4px -1px;color:#fff; font-weight:bold; font-size:14px} 
.list li p a:hover{background-position:4px -25px;text-decoration:none} 

jQuery代码

当用户点击自己喜欢的图片上的红心按钮时,向后台love.php发送ajax请求,请求响应成功后,更新原有的数值。

 代码如下 复制代码

$(function(){ 
    $("p a").click(function(){ 
        var love = $(this); 
        var id = love.attr("rel"); //对应id 
        love.fadeOut(300); //渐隐效果 
        $.ajax({ 
            type:"POST", 
            url:"love.php", 
            data:"id="+id, 
            cache:false, //不缓存此页面 
            success:function(data){ 
                love.html(data); 
                love.fadeIn(300); //渐显效果 
            } 
        }); 
        return false; 
    }); 
}); 

love.php

后台love.php接收前端的ajax请求,根据提交的图片id值,查找IP表中是否已有该用户ip的点击记录,如果有则告诉用户已“喜欢过了”,反之,则进行一下操作:

1、更新图片表中对应的图片love字段值,将数值加1。

2、将该用户IP信息写入到pic_ip表中,用以防止用户重复点击。

3、获取更新后的love值,即喜欢该图片的用户总数,并将该总数输出给前端页面。

 代码如下 复制代码

<?php
$host="localhost";
$db_user="root";
$db_pass="";
$db_name="demo";
$timezone="Asia/Shanghai";

$link=mysql_connect($host,$db_user,$db_pass);
mysql_select_db($db_name,$link);
mysql_query("SET names UTF8");
?>

 

 

<?php
include_once("connect.php");

$ip = get_client_ip();
$id = $_POST['id'];
if(!isset($id) || empty($id)) exit;

$ip_sql=mysql_query("select ip from pic_ip where pic_id='$id' and ip='$ip'");
$count=mysql_num_rows($ip_sql);
if($count==0){
$sql = "update pic set love=love+1 where id='$id'";
mysql_query( $sql);
$sql_in = "insert into pic_ip (pic_id,ip) values ('$id','$ip')";
mysql_query( $sql_in);
$result = mysql_query("select love from pic where id='$id'");
$row = mysql_fetch_array($result);
$love = $row['love'];
echo $love;
}else{
echo "喜欢过了..";
}

//获取用户真实IP
function get_client_ip() {
if (getenv("HTTP_CLIENT_IP") && strcasecmp(getenv("HTTP_CLIENT_IP"), "unknown"))
$ip = getenv("HTTP_CLIENT_IP");
else
if (getenv("HTTP_X_FORWARDED_FOR") && strcasecmp(getenv("HTTP_X_FORWARDED_FOR"), "unknown"))
$ip = getenv("HTTP_X_FORWARDED_FOR");
else
if (getenv("REMOTE_ADDR") && strcasecmp(getenv("REMOTE_ADDR"), "unknown"))
$ip = getenv("REMOTE_ADDR");
else
if (isset ($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] && strcasecmp($_SERVER['REMOTE_ADDR'], "unknown"))
$ip = $_SERVER['REMOTE_ADDR'];
else
$ip = "unknown";
return ($ip);
}
?>


代码中get_client_ip()函数是用来获取用户的真实IP

本文章来给大家介绍一个关于php中读写文件与读写数据库的效率对比,有需要了解的朋友可参考。

测试程序如下:

//说明1:由于读数据库语句调用简单的封包函数两次,所以把读文件也改成连续调用两次,数据库记录ID为1就在第一条,并且唯一索引。

 代码如下 复制代码

//说明2:测试两次一次是4K数据,一次是整形数据

set_time_limit(0);

function fnGet($filename)
{
    $content = file_get_contents($filename);
    return $content;
}

function fnGetContent($filename)
{
    $content = fnGet($filename);
    return $content;
}
   
$times=100000;   
echo '数据库查询结果:<br/>';
//---------------------------------
$begin=fnGetMicroTime();
for($i=0;$i<$times;$i++)
{
    $res=$dbcon->mydb_query("SELECT log_Content FROM blog WHERE log_ID='1'");
    $row=$dbcon->mydb_fetch_row($res);
    $content=$row[0];
}
echo 'fetch_row '.$times.' 次时间:<font color=red>'.(fnGetMicroTime()-$begin).'</font>秒<br/>';
//---------------------------------

$begin=fnGetMicroTime();
for($i=0;$i<$times;$i++)
{
    $res=$dbcon->mydb_query("SELECT log_Content FROM blog WHERE log_ID='1'");
    $row=$dbcon->mydb_fetch_array($res);
    $content=$row['log_Content'];   
}
echo 'fetch_array '.$times.' 次时间:<font color=red>'.(fnGetMicroTime()-$begin).'</font>秒<br/>';
//---------------------------------

$begin=fnGetMicroTime();
for($i=0;$i<$times;$i++)
{
    $res=$dbcon->mydb_query("SELECT log_Content FROM blog WHERE log_ID='1'");
    $row=$dbcon->mydb_fetch_object($res);
    $content=$row->log_Content;   
}
echo 'fetch_object '.$times.' 次时间:<font color=red>'.(fnGetMicroTime()-$begin).'</font>秒<br/>';
//---------------------------------

$dbcon->mydb_free_results();
$dbcon->mydb_disconnect();

fnWriteCache('test.txt',$content);

echo '直接读文件测试结果:<br/>';

//---------------------------------
$begin=fnGetMicroTime();
for($i=0;$i<$times;$i++)
{
    $content = fnGetContent('test.txt');
}
echo 'file_get_contents直接读'.$times.'次时间:<font color=red>'.(fnGetMicroTime()-$begin).'</font>秒<br/>';
//---------------------------------

$begin=fnGetMicroTime();
for($i=0;$i<$times;$i++)
{
    $fname = 'test.txt';
    if(file_exists($fname))
     {
        $fp=fopen($fname,"r");//flock($fp,LOCK_EX);       
        $file_data=fread($fp, filesize($fname));//rewind($fp);      
        fclose($fp);
    }
    $content = fnGetContent('test.txt');
}   
echo 'fopen直接读'.$times.'次时间:<font color=red>'.(fnGetMicroTime()-$begin).'</font>秒<br/>';

4K大小数据的查询结果:

fetch_row 100000 次时间:16.737720012665秒

fetch_array 100000 次时间:16.661195993423秒

fetch_object 100000 次时间:16.775065898895秒

直接读文件测试结果:

file_get_contents直接读100000次时间:5.4631857872009秒

fopen直接读100000次时间:11.463611125946秒
 
整形ID查询结果:

fetch_row 100000 次时间:12.812072038651秒

fetch_array 100000 次时间:12.667390108109秒

fetch_object 100000 次时间:12.988099098206秒

直接读文件测试结果:

file_get_contents直接读100000次时间:5.6616430282593秒

fopen直接读100000次时间:11.542816877365秒
 

 
测试结论:

1、直接读文件相比数据库查询效率更胜一筹,而且文中还没算上连接和断开的时间。

2、一次读取的内容越大,直接读文件的优势会越明显(读文件时间都是小幅增长,这跟文件存储的连续性和簇大小等有关系),这个结果恰恰跟天缘预料的相反,说明MYSQL对更大文件读取可能又附加了某些操作(两次时间增长了近30%),如果只是单纯的赋值转换应该是差异偏小才对。

3、写文件和INSERT几乎不用测试就可以推测出,数据库效率只会更差。

4、很小的配置文件如果不需要使用到数据库特性,更加适合放到独立文件里存取,无需单独创建数据表或记录,很大的文件比如图片、音乐等采用文件存储更为方便,只把路径或缩略图等索引信息放到数据库里更合理一些。

5、PHP上如果只是读文件,file_get_contents比fopen、fclose更有效率,不包括判断存在这个函数时间会少3秒左右。

6、fetch_row和fetch_object应该是从fetch_array转换而来的,天缘没看过PHP的源码,单从执行上就可以说明fetch_array效率更高,这跟网上的说法似乎相反。

本文章给大家来总结几种实现下载短点续传程序功能,这些函数中主要是用到了php的header函数,有需要了解的朋友可进入参考。

例如:下载时输出  下载文件大小,文件名等等
前提是.htaccess文件的配置需要添加一句
SetEnv no-gzip dont-vary
就是针对文件不进行压缩处理

例1

 代码如下 复制代码

<?php
function download($file_dir,$file_name)
//参数说明:
//file_dir:文件所在目录
//file_name:文件名
{
$file_dir = chop($file_dir);//去掉路径中多余的空格
//得出要下载的文件的路径
if($file_dir != '')
{
$file_path = $file_dir;
if(substr($file_dir,strlen($file_dir)-1,strlen($file_dir)) != '/')
$file_path .= '/';
$file_path .= $file_name;
} else {
$file_path = $file_name;
}
//判断要下载的文件是否存在
if(!file_exists($file_path))
{
echo '对不起,你要下载的文件不存在。';
return false;
}
$file_size = filesize($file_path);
@header("Cache-control: public");
@header("Pragma: public");
//header("Content-Encoding: gzip");
@header("Content-Type: application/octetstream");
header("Content-Length: $file_size");
Header("Accept-Ranges: bytes");
header("Content-Disposition: attachment; filename=".$file_name);
$fp = fopen($file_path,"r");
fpassthru($fp);
return true;
}
download('路径参数','文件名');
?>

例2

 代码如下 复制代码
$fname = './MMLDZG.mp3'; 
$fp = fopen($fname,'rb'); 
$fsize = filesize($fname); 
if (isset($_SERVER['HTTP_RANGE']) && ($_SERVER['HTTP_RANGE'] != "") && preg_match("/^bytes=([0-9]+)-$/i", $_SERVER['HTTP_RANGE'], $match) && ($match[1] < $fsize)) {
    $start = $match[1];
} else {
    $start = 0;
}
@header("Cache-control: public"); @header("Pragma: public");
if ($star--> 0) { 
    fseek($fp, $start); 
    Header("HTTP/1.1 206 Partial Content"); 
    Header("Content-Length: " . ($fsize - $start)); 
    Header("Content-Ranges: bytes" . $start . "-" . ($fsize - 1) . "/" . $fsize); 
} else { 
    header("Content-Length: $fsize"); 
    Header("Accept-Ranges: bytes"); 

@header("Content-Type: application/octet-stream"); 
@header("Content-Disposition: attachment;filename=mmdld.mp3"); 
fpassthru($fp); 
 


fpassthru() 函数输出文件指针处的所有剩余数据。

该函数将给定的文件指针从当前的位置读取到 EOF,并把结果写到输出缓冲区

上面两个实例对中文支持不好,下面这个函数很好的解决了这个问题

 代码如下 复制代码

 <?php

  /**

  * PHP-HTTP断点续传实现

  * @param string $path: 文件所在路径

  * @param string $file: 文件名

  * @return void

  */

  function download($path,$file) {

  $real = $path.'/'.$file;

  if(!file_exists($real)) {

  return false;

  }

  $size = filesize($real);

  $size2 = $size-1;

  $range = 0;

  if(isset($_SERVER['HTTP_RANGE'])) {

  header('HTTP /1.1 206 Partial Content');

  $range = str_replace('=','-',$_SERVER['HTTP_RANGE']);

  $range = explode('-',$range);

  $range = trim($range[1]);

  header('Content-Length:'.$size);

  header('Content-Range: bytes '.$range.'-'.$size2.'/'.$size);

  } else {

  header('Content-Length:'.$size);

  header('Content-Range: bytes 0-'.$size2.'/'.$size);

  }

  header('Accenpt-Ranges: bytes');

  header('application/octet-stream');

  header("Cache-control: public");

  header("Pragma: public");

  //解决在IE中下载时中文乱码问题

  $ua = $_SERVER['HTTP_USER_AGENT'];

  if(preg_match('/MSIE/',$ua)) {

  $ie_filename = str_replace('+','%20',urlencode($file));

  header('Content-Dispositon:attachment; filename='.$ie_filename);

  } else {

  header('Content-Dispositon:attachment; filename='.$file);

  }

  $fp = fopen($real,'rb+');

  fseek($fp,$range);

  while(!feof($fp)) {

  set_time_limit(0);

  print(fread($fp,1024));

  flush();

  ob_flush();

  }

  fclose($fp);

  }

  /*End of PHP*/

php文件上传与多文件上传其它没有多大的区别,多文件上传只是我们把表单名改成数组形式,而获取利用foreach遍历就可以实现多文件上传了,动态多文件上传只要在js加一个动态增加多文件上传框,同样在php处理时就遍历一下数组就成了。

最简单的实例如下

 代码如下 复制代码

<form action="" method="post" enctype="multipart/form-data">
<p>Pictures:
<input type="file" name="pictures[]" />
<input type="file" name="pictures[]" />
<input type="file" name="pictures[]" />
<input type="submit" value="Send" />
</p>
</form>

       <?php
foreach ($_FILES["pictures"]["error"] as $key => $error) {
        if ($error == UPLOAD_ERR_OK) {
            $tmp_name = $_FILES["pictures"]["tmp_name"][$key];
            $name = $_FILES["pictures"]["name"][$key];
            move_uploaded_file($tmp_name, "data/$name");
        }
}
?>

 

下面分享其它朋友的例子
例1

 代码如下 复制代码

<?
//filename:multi_upload.php
if($ifupload)
{
$path=AddSlashes(dirname($PATH_TRANSLATED))."\upload\";
for($i=1;$i<=8;$i++)
{
$files="afile".$i;
if(${$files}!="none")
{
if(copy(${$files},$path.${$files."_name"}))
{
}
}
}
print "<b>You have uploaded files successfully</b><br>";
print "<a href="multi_upload.php">Return</a>";
exit;
}
?>
<html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<meta NAME="GENERATOR" Content="Microsoft Visual Studio 6.0">
<title>多个文件上传</title>
<style type="text/css">
<!--
BODY
{
PADDING-RIGHT: 0px;
MARGIN-TOP: 0px;
PADDING-LEFT: 0px;
FONT-SIZE: 8px;
MARGIN-LEFT: 0px;
CURSOR: default;
COLOR: black;
MARGIN-RIGHT: 0px;
PADDING-TOP: 0px;
FONT-FAMILY: Arial;
BACKGROUND-COLOR: transparent;
TEXT-ALIGN: center
}
.TxtInput
{
FONT-SIZE: 8pt;
WIDTH: 100%;
CURSOR: default;
COLOR: black;
FONT-FAMILY: Arial;
HEIGHT: 21px;
BACKGROUND-COLOR: white;
TEXT-ALIGN: left
}
.FieldLabel
{
FONT-WEIGHT: normal;
FONT-SIZE: 9pt;
WIDTH: 100%;
COLOR: black;
FONT-FAMILY: Arial;
BACKGROUND-COLOR: transparent;
TEXT-ALIGN: left
}
.HeadBtn
{
BORDER-RIGHT: black 1px solid;
BORDER-TOP: white 1px solid;
FONT-SIZE: 8pt;
OVERFLOW: hidden;
BORDER-LEFT: white 1px solid;
WIDTH: 70px;
COLOR: black;
BORDER-BOTTOM: black 1px solid;
FONT-FAMILY: Arial;
HEIGHT: 21px;
BACKGROUND-COLOR: #8e8dcd;
TEXT-ALIGN: center
}
.TransEx
{
BORDER-RIGHT: black 1px solid;
PADDING-RIGHT: 8px;
BORDER-TOP: white 1px solid;
PADDING-LEFT: 8px;
FONT-SIZE: 8pt;
PADDING-BOTTOM: 3px;
BORDER-LEFT: white 1px solid;
WIDTH: 720px;
PADDING-TOP: 3px;
BORDER-BOTTOM: black 1px solid;
FONT-FAMILY: Arial;
BACKGROUND-COLOR: #c0c0c0;
TEXT-ALIGN: center
}
-->
</style>
<script language="javascript">
function window.onload()
{
document.forms[0].btnOk.onclick=btn_ok;
}
function btn_ok()
{
for(var i=1;i<=8;i++)
{
if(eval("document.forms[0].afile"+i+".value!=''"))
document.forms[0].submit();
return true;
}
alert("None of file have been selected");
return false;
}
</script>
</head>
<body>
<form method="post" action="multi_upload.php" name="frmUpload" enctype="multipart/form-data" >
<table id="divContainer" style="HEIGHT: 100%; WIDTH: 380" border="0">
<tr height="35"><td align="right" valign="bottom">多文件上传 </td></tr>
<tr><td align="center" valign="top">
<table class="Transex" border="0" cellspacing="0" cellpadding="0" style="WIDTH: 360px">
<tr style="HEIGHT: 10px" >
<td style="WIDTH: 5px"></td>
<td colspan="2"></td>
<td style="WIDTH: 5px"></td>
</tr>
<tr>
<td></td>
<td nowrap><label class="FieldLabel"> 文件1</label></td>
<td><input type="file" class="TxtInput" tabindex="1" name="afile1" style="WIDTH: 282px"></td>
<td></td>
</tr>
<tr>
<td></td>
<td nowrap><label class="FieldLabel"> 文件2</label></td>
<td><input type="file" class="TxtInput" tabindex="2" name="afile2" style="WIDTH: 282px"></td>
<td></td>
</tr>
<tr>
<td></td>
<td nowrap><label class="FieldLabel"> 文件3</label></td>
<td><input type="file" class="TxtInput" tabindex="3" name="afile3" style="WIDTH: 282px"></td>
<td></td>
</tr>
<tr>
<td></td>
<td nowrap><label class="FieldLabel"> 文件4</label></td>
<td><input type="file" class="TxtInput" tabindex="4" name="afile4" style="WIDTH: 282px"></td>
<td></td>
</tr>
<tr>
<td></td>
<td nowrap><label class="FieldLabel"> 文件5</label></td>
<td><input type="file" class="TxtInput" tabindex="5" name="afile5" style="WIDTH: 282px"></td>
<td></td>
</tr>
<tr>
<td></td>
<td nowrap><label class="FieldLabel"> 文件6</label></td>
<td><input type="file" class="TxtInput" tabindex="6" name="afile6" style="WIDTH: 282px"></td>
<td></td>
</tr>
<tr>
<td></td>
<td nowrap><label class="FieldLabel"> 文件7</label></td>
<td><input type="file" class="TxtInput" tabindex="7" name="afile7" style="WIDTH: 282px"></td>
<td></td>
</tr>
<tr>
<td></td>
<td nowrap><label class="FieldLabel"> 文件8</label></td>
<td><input type="file" class="TxtInput" tabindex="8" name="afile8" style="WIDTH: 282px"></td>
<td></td>
</tr>
<tr style="HEIGHT: 5px">
<td style="WIDTH: 5px">
<td style="WIDTH: 350px" colspan="2"><hr width="100%"></td>
<td style="WIDTH: 5px"></td>
</tr>
<tr>
<td></td>
<td colspan="2" align="left">
<button tabindex="5" class="headbtn" align="center" name="btnOk" id="btnOk" accesskey="O">确定(<ins>O</ins>)</button>
<input type="hidden" name="ifupload" value=1>
<button tabindex="5" class="headbtn" align="center" name="btnCancel" id="btnCancel" accesskey="C" onclick="window.close();">取消(<ins>C</ins>)</button></td>
<td></td>
</tr>
<tr style="HEIGHT: 5px">
<td style="WIDTH: 5px">
<td style="WIDTH: 350px" colspan="2"></td>
<td style="WIDTH: 5px"></td>
</tr>
</table>
</td>
</tr>
</table>
</form>
</body>
</html>


如果我们要动态不确定性的多文件上传怎么实现下面也有实例

文件上传代码

 代码如下 复制代码
view plaincopy to clipboardprint?
<!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=gb2312" />
<title>文档上传</title>
</head>
<body>
<script language="javascript"><!--
动态添加文件选择控件-->
function AddRow()
{
var eNewRow = tblData.insertRow();
for (var i=0;i<1;i++)
{
var eNewCell = eNewRow.insertCell();
eNewCell.innerHTML = "<tr><td><input type='file' name='filelist[]' size='50'/></td></tr>";
}
}
// --></script>
<form name="myform" method="post" action="uploadfile.php" enctype="multipart/form-data" >
<table id="tblData" width="400" border="0">
<!-- 将上传文件必须用post的方法和enctype="multipart/form-data" -->
<!-- 将本页的网址传给uploadfile.php-->
<input name="postadd" type="hidden" value="<?php echo "http://".$_SERVER['HTTP_HOST'].$_SERVER["PHP_SELF"]; ?>" />
<tr><td>文件上传列表
<input type="button" name="addfile" onclick="AddRow()" value="添加列表" /></td></tr>
<!-- filelist[]必须是一个数组-->
<tr><td><input type="file" name="filelist[]" size="50" /></td></tr>
</table>
<input type="submit" name="submitfile" value="提交文件" />
</form>
</body>
</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=gb2312" />
<title>文档上传</title>
</head>
<body>
<script language="javascript"><!--
动态添加文件选择控件-->
function AddRow()
{
var eNewRow = tblData.insertRow();
for (var i=0;i<1;i++)
{
var eNewCell = eNewRow.insertCell();
eNewCell.innerHTML = "<tr><td><input type='file' name='filelist[]' size='50'/></td></tr>";
}
}
// --></script>
<form name="myform" method="post" action="uploadfile.php" enctype="multipart/form-data" >
<table id="tblData" width="400" border="0">
<!-- 将上传文件必须用post的方法和enctype="multipart/form-data" -->
<!-- 将本页的网址传给uploadfile.php-->
<input name="postadd" type="hidden" value="<?php echo "http://".$_SERVER['HTTP_HOST'].$_SERVER["PHP_SELF"]; ?>" />
<tr><td>文件上传列表
<input type="button" name="addfile" onclick="AddRow()" value="添加列表" /></td></tr>
<!-- filelist[]必须是一个数组-->
<tr><td><input type="file" name="filelist[]" size="50" /></td></tr>
</table>
<input type="submit" name="submitfile" value="提交文件" />
</form>
</body>
</html>
提交文件代码
view plaincopy to clipboardprint?
<!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=gb2312" />
<title>文件上传结果</title>
</head>
<body>
<?php
if ($_POST["submitfile"]!="")
{
$Path="./".date('Ym')."/";
if (!is_dir($Path))//创建路径
{ mkdir($Path); }
echo "<div>";
for ($i=0;$i<count($filelist);$i++)
{ //$_FILES["filelist"]["size"][$i]的排列顺序不可以变,因为fileist是一个二维数组
if ($_FILES["filelist"]["size"][$i]!=0)
{
$File=$Path.date('Ymdhm')."_".$_FILES["filelist"]["name"][$i];
if (move_uploaded_file($_FILES["filelist"]["tmp_name"][$i],$File))
{ echo "文件上传成功 文件类型:".$_FILES["filelist"]["type"][$i]." "."文件名:"
.$_FILES["filelist"]["name"][$i]."<br>"; }
else
{ echo "文件名:".$_FILES["filelist"]["name"][$i]."上传失败</br>"; }
}
}
echo "</div><br><a href="$postadd" href="$postadd">返回</a></div>";
}
?>
</body>
</html>

另:错误信息说明
从 PHP 4.2.0 开始,PHP 将随文件信息数组一起返回一个对应的错误代码。该代码可以在文件上传时生成的文件数组中的 error 字段中被找到,也就是 $_FILES['userfile']['error']。
UPLOAD_ERR_OK
其值为 0,没有错误发生,文件上传成功。
UPLOAD_ERR_INI_SIZE
其值为 1,上传的文件超过了 php.ini 中 upload_max_filesize 选项限制的值。
UPLOAD_ERR_FORM_SIZE
其值为 2,上传文件的大小超过了 HTML 表单中 MAX_FILE_SIZE 选项指定的值。 UPLOAD_ERR_PARTIAL
其值为 3,文件只有部分被上传。
UPLOAD_ERR_NO_FILE
其值为 4,没有文件被上传。
UPLOAD_ERR_NO_TMP_DIR
其值为 6,找不到临时文件夹。PHP 4.3.10 和 PHP 5.0.3 引进。
UPLOAD_ERR_CANT_WRITE
其值为 7,文件写入失败。PHP 5.1.0 引进。
注意: 以上值在 PHP 4.3.0 之后变成了 PHP 常量。

[!--infotagslink--]

相关文章

  • PHP页面转UTF-8中文编码乱码的解决办法

    对于乱码这个问题php开发者几乎都会有碰到过,我们下面主要是介绍了php文件乱码和页面乱码。PHP页面转UTF-8编码问题 1.在代码开始出加入一行: header("Content-Type: text/html;charset=utf-8"); 2.PHP文件编码问题...2015-10-21
  • 微信小程序 页面跳转传递值几种方法详解

    这篇文章主要介绍了微信小程序 页面跳转传递值几种方法详解的相关资料,需要的朋友可以参考下...2017-01-16
  • IE6中链接A的href为javascript协议时不在当前页面跳转

    切页面时有时用链接A来替代按钮,这样做有几个好处 鼠标放上时默认有手状效果(不用添加cursor:pointer) 可以添加低版本IE都支持的伪类 如果点击时页面要整体刷新,即跳转,这时IE6则不尽人意,如下 复制代码 代码如下: <p>...2014-06-07
  • Vue.js实战之利用vue-router实现跳转页面

    对于单页应用,官方提供了vue-router进行路由跳转的处理,这篇文章主要给大家介绍了Vue.js实战之利用vue-router实现跳转页面的相关资料,需要的朋友可以参考借鉴,下面来一起看看吧。...2017-04-03
  • PHP利用REFERER根居访问来地址进行页面跳转

    比如,我有一个开发一个黄页源码上转到了脚本之家。之前定了一个演示程序地址: http://www.jb51.net 而现在这个域名需要用来作其它的站,又不杀望原来的演示地址失效怎么办呢。那我就可以利用PHP REFERER来判断来源如果...2013-10-04
  • js实现页面跳转重定向的几种方式

    第一种: 复制代码 代码如下: <script language="javascript"type="text/javascript"> window.location.href="http://shanghepinpai.com"; </script> 第二种: 复制代码 代码如下: <script language="javascript"> aler...2014-05-31
  • php防止伪造跨站请求实现程序

    CSRF站外类型的漏洞其实就是传统意义上的外部提交数据问题,一般程序员会考虑给一些留言评论等的表单加上水印以防止SPAM问题,但是为了用户的体验性,一些操作可能没有做任...2016-11-25
  • 微信小程序 详解页面跳转与返回并回传数据

    这篇文章主要介绍了微信小程序 详解页面跳转与返回并回传数据的相关资料,需要的朋友可以参考下...2017-02-19
  • php fsockopen 伪造 post和get方法

    <?php //fsocket模拟post提交 $purl = "http://localhost/netphp/test2.php?uu=rrrrrrrrrrrr"; print_r(parse_url($url)); sock_post($purl,"uu=5555555555555555...2016-11-25
  • php漏洞之跨网站请求伪造与防止伪造方法

    今天我来给大家介绍在php中跨网站请求伪造的实现方法与最后我们些常用的防止伪造的具体操作方法,有需要了解的朋友可进入参考。 伪造跨站请求介绍 伪造跨站请求...2016-11-25
  • Ruby rails 页面跳转(render和redirect_to)

    今天在做R.R.log的时候发现个问题,在修改密码的时候如果没有通过校验,没有显示校验错误的信息。...2020-06-30
  • php页面函数设置超时限制

    碰到页面程序执行超时时会提醒Fatal error: Maximum execution time of 300 seconds exceeded 是因为程序执行时间超过了最大允许执行时间,解决办法我总结了好几个大...2016-11-25
  • php页面缓存实现方法总结

    在php页面缓存主要用到的是ob系列函数,如ob_start(),ob_end_flush(),ob_get_contents(),但是更高级的缓存是不使用这些函数的,本文章最后一个实现就有讲到,大家可参考一...2016-11-25
  • php页面传递参数值几种方法总结

    php是一种服务器的脚本语言,他也是现在最为流行的WEB开发语言,下面我们来讲述一下几种上在php开发应用中常用的四种页面之间传递参数的几种方法。 第一种: 使用客户...2016-11-25
  • PHP页面定时跳转实现方法

    php定时跳转我们需要利用header函数输入html或js代码来实现定时跳转了,下面我来介绍一个简单的例子 php代码 代码如下 复制代码 header("ref...2016-11-25
  • SignalR发送页面跳转通知的方法

    这篇文章主要为大家详细介绍了如何使用SignalR发送页面跳转通知的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-09-22
  • 关于php页面静态化原理与例子

    静态化页面可以减少服务器的一个负载了,如果我们同样的一台机器如果有数据库连接只能负载100IP,那么用静态htm文件估计可以负载1000IP,所以我们很多站都是静态化的页面这...2016-11-25
  • php CURL伪造IP和来源实现程序

    伪造IP来源对于php来说是很简单的一件事情,我们只要利用了php curl即可实现伪造IP来源哦,IP地址你可以随便写哦。 实例 代码如下 复制代码 $c...2016-11-25
  • 浅谈ASP.NET MVC 防止跨站请求伪造(CSRF)攻击的实现方法

    下面小编就为大家分享一篇浅谈ASP.NET MVC 防止跨站请求伪造(CSRF)攻击的实现方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-09-22
  • PHP 伪造IP和来源信息

    查了下,CURL确实很强悍的可以伪造IP和来源,下面看实现有需要的朋友可以参考一下。 1.php教程 请求 2.php 。 1.php代码: $ch = curl_init(); curl_setopt($ch, CURLOP...2016-11-25