服务器操作系统:LINUX虚拟机;
php版本:5.1.6以上
以下是代码:共有两个
//html上传部分<html><head>
<title>文件上传</title>
</head><body>
<form method="post" action="up_load.php" enctype="multipart/form-data"> <table border=0 cellspacing=0 cellpadding=0 align=center width="100%"> <tr> <td width=55 height=20 align="center"> <input type="hidden" name="MAX_FILE_SIZE" value="2000000">文件: </TD> <td height="16"> <input name="userfile" type="file" >
<input type="submit" value="上传" > </td> </tr> </table> </form>
</body></html>
/**************************php处理部分/<?php
$uploaddir = "./files/";//设置文件保存目录 注意包含/
$type=array("jpg","gif","bmp","jpeg","png");//设置允许上传文件的类型
$patch="http://192.168.3.1/";//程序所在路径
// echo "1"; //获取文件后缀名函数
function fileext($filename)
{
return substr(strrchr($filename, '.'), 1);
}
//echo "2"; function random($length)
{
$hash = 'CR-';
$chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz';
$max = strlen($chars) - 1;
mt_srand((double)microtime() * 1000000);
for($i = 0; $i < $length; $i++)
{
$hash .= $chars[mt_rand(0, $max)];
}
return $hash;
}
//echo "3"; $a=strtolower(fileext($_FILES['userfile']['name']));
//echo "4" ; //判断文件类型
if(!in_array(strtolower(fileext($_FILES['userfile']['name'])),$type))
{
$text=implode(",",$type);
echo "您只能上传以下类型文件: ",$text,"<br>";
}
else{
$filename=explode(".",$_FILES['userfile']['name']);
//echo $filename[0];
do{
$filename[0]=random(10); //设置随机数长度
$name=implode(".",$filename);
//$name1=$name.".Mcncc";
$uploadfile=$uploaddir.$name;
// echo $uploadfile;
}
while(file_exists($uploadfile));
//echo $uploadfile; if (move_uploaded_file($_FILES['userfile']['tmp_name'],$uploadfile))
{
//输出图片预览
if(is_uploaded_file($_FILES['userfile']['tmp_name']){
echo "<center>您的文件已经上传完毕 上传图片预览:</center><br><center><img src='$uploadfile'></center>";
echo " <br><center><a href='javascrīpt:history.go(-1)'>继续上传</a></center>";
}
else{
echo "上传失败!";//[color=#993366]难道我不是POST提交的吗?
}
}[/color] }//echo "test";
?>这是从网上DOWN的一个上传的源码?调了一下,可以上传文件,即在LINUX本地上可以看到上传的文件....
但为什么提示却是文件上传失败?....查了一下PHP手册关于is_uploaded_file();的用法:bool is_uploaded_file ( string $filename )
如果 filename 所给出的文件是通过 HTTP POST 上传的则返回 TRUE。这可以用来确保恶意的用户无法欺骗脚本去访问本不能访问的文件,例如 /etc/passwd。 这种检查显得格外重要,如果上传的文件有可能会造成对用户或本系统的其他用户显示其内容的话。 为了能使 is_uploaded_file() 函数正常工作,必段指定类似于 $_FILES['userfile']['tmp_name'] 的变量,而在从客户端上传的文件名 $_FILES['userfile']['name'] 不能正常运作。 难道说我的文件不是POST提交的?还是LINUX上的哪些设置不对....请牛牛们指点....
php版本:5.1.6以上
以下是代码:共有两个
//html上传部分<html><head>
<title>文件上传</title>
</head><body>
<form method="post" action="up_load.php" enctype="multipart/form-data"> <table border=0 cellspacing=0 cellpadding=0 align=center width="100%"> <tr> <td width=55 height=20 align="center"> <input type="hidden" name="MAX_FILE_SIZE" value="2000000">文件: </TD> <td height="16"> <input name="userfile" type="file" >
<input type="submit" value="上传" > </td> </tr> </table> </form>
</body></html>
/**************************php处理部分/<?php
$uploaddir = "./files/";//设置文件保存目录 注意包含/
$type=array("jpg","gif","bmp","jpeg","png");//设置允许上传文件的类型
$patch="http://192.168.3.1/";//程序所在路径
// echo "1"; //获取文件后缀名函数
function fileext($filename)
{
return substr(strrchr($filename, '.'), 1);
}
//echo "2"; function random($length)
{
$hash = 'CR-';
$chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz';
$max = strlen($chars) - 1;
mt_srand((double)microtime() * 1000000);
for($i = 0; $i < $length; $i++)
{
$hash .= $chars[mt_rand(0, $max)];
}
return $hash;
}
//echo "3"; $a=strtolower(fileext($_FILES['userfile']['name']));
//echo "4" ; //判断文件类型
if(!in_array(strtolower(fileext($_FILES['userfile']['name'])),$type))
{
$text=implode(",",$type);
echo "您只能上传以下类型文件: ",$text,"<br>";
}
else{
$filename=explode(".",$_FILES['userfile']['name']);
//echo $filename[0];
do{
$filename[0]=random(10); //设置随机数长度
$name=implode(".",$filename);
//$name1=$name.".Mcncc";
$uploadfile=$uploaddir.$name;
// echo $uploadfile;
}
while(file_exists($uploadfile));
//echo $uploadfile; if (move_uploaded_file($_FILES['userfile']['tmp_name'],$uploadfile))
{
//输出图片预览
if(is_uploaded_file($_FILES['userfile']['tmp_name']){
echo "<center>您的文件已经上传完毕 上传图片预览:</center><br><center><img src='$uploadfile'></center>";
echo " <br><center><a href='javascrīpt:history.go(-1)'>继续上传</a></center>";
}
else{
echo "上传失败!";//[color=#993366]难道我不是POST提交的吗?
}
}[/color] }//echo "test";
?>这是从网上DOWN的一个上传的源码?调了一下,可以上传文件,即在LINUX本地上可以看到上传的文件....
但为什么提示却是文件上传失败?....查了一下PHP手册关于is_uploaded_file();的用法:bool is_uploaded_file ( string $filename )
如果 filename 所给出的文件是通过 HTTP POST 上传的则返回 TRUE。这可以用来确保恶意的用户无法欺骗脚本去访问本不能访问的文件,例如 /etc/passwd。 这种检查显得格外重要,如果上传的文件有可能会造成对用户或本系统的其他用户显示其内容的话。 为了能使 is_uploaded_file() 函数正常工作,必段指定类似于 $_FILES['userfile']['tmp_name'] 的变量,而在从客户端上传的文件名 $_FILES['userfile']['name'] 不能正常运作。 难道说我的文件不是POST提交的?还是LINUX上的哪些设置不对....请牛牛们指点....
如果移动文件成功,会从 hash 表中删除那个文件名
而 is_uploaded_file 恰好是根据文件名从 hash 表中查找这个项存在不存在
所以 is_uploaded_file 返回失败只要记住 is_uploaded_file,必须在使用 move_uploaded_file 移动文件之前调用6128 PHP_FUNCTION(move_uploaded_file)
6129 {
6130 zval **path, **new_path;
6131 zend_bool successful = 0;
6132
6133 #ifndef PHP_WIN32
6134 int oldmask; int ret;
6135 #endif
6136
6137 if (!SG(rfc1867_uploaded_files)) {
6138 RETURN_FALSE;
6139 }
6140
6141 if (ZEND_NUM_ARGS() != 2 || zend_get_parameters_ex(2, &path, &new_path) != SUCCESS) {
6142 ZEND_WRONG_PARAM_COUNT();
6143 }
6144 convert_to_string_ex(path);
6145 convert_to_string_ex(new_path);
6146
6147 if (!zend_hash_exists(SG(rfc1867_uploaded_files), Z_STRVAL_PP(path), Z_STRLEN_PP(path)+1)) {
6148 RETURN_FALSE;
6149 }
6150
6151 if (PG(safe_mode) && (!php_checkuid(Z_STRVAL_PP(new_path), NULL, CHECKUID_CHECK_FILE_AND_DIR))) {
6152 RETURN_FALSE;
6153 }
6154
6155 if (php_check_open_basedir(Z_STRVAL_PP(new_path) TSRMLS_CC)) {
6156 RETURN_FALSE;
6157 }
6158
6159 VCWD_UNLINK(Z_STRVAL_PP(new_path));
6160 if (VCWD_RENAME(Z_STRVAL_PP(path), Z_STRVAL_PP(new_path)) == 0) {
6161 successful = 1;
6162 #ifndef PHP_WIN32
6163 oldmask = umask(077);
6164 umask(oldmask);
6165
6166 ret = VCWD_CHMOD(Z_STRVAL_PP(new_path), 0666 & ~oldmask);
6167
6168 if (ret == -1) {
6169 php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", strerror(errno));
6170 }
6171 #endif
6172 } else if (php_copy_file_ex(Z_STRVAL_PP(path), Z_STRVAL_PP(new_path), STREAM_DISABLE_OPEN_BASEDIR TSRMLS_CC) == SUCCESS) {
6173 VCWD_UNLINK(Z_STRVAL_PP(path));
6174 successful = 1;
6175 }
6176
6177 if (successful) {
6178 zend_hash_del(SG(rfc1867_uploaded_files), Z_STRVAL_PP(path), Z_STRLEN_PP(path)+1);
6179 } else {
6180 php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to move '%s' to '%s'", Z_STRVAL_PP(path), Z_STRVAL_PP(new_path));
6181 }
6182 RETURN_BOOL(successful);
6183 }