搜索
首页后端开发php教程PHP中的move_uploaded_file() 函数

PHP中的move_uploaded_file() 函数

Jun 07, 2018 pm 04:02 PM
move_uploaded_filephp

这篇文章主要介绍了PHP move_uploaded_file() 函数,其实就是将上传的文件移动到新位置,需要的朋友可以参考下

定义和用法

move_uploaded_file() 函数将上传的文件移动到新位置。

若成功,则返回 true,否则返回 false。

语法

move_uploaded_file(file,newloc)

参数 描述
file 必需。规定要移动的文件。
newloc 必需。规定文件的新位置。

说明

本函数检查并确保由 file 指定的文件是合法的上传文件(即通过 PHP 的 HTTP POST 上传机制所上传的)。如果文件合法,则将其移动为由 newloc 指定的文件。

如果 file 不是合法的上传文件,不会出现任何操作,move_uploaded_file() 将返回 false。

如果 file 是合法的上传文件,但出于某些原因无法移动,不会出现任何操作,move_uploaded_file() 将返回 false,此外还会发出一条警告。

这种检查显得格外重要,如果上传的文件有可能会造成对用户或本系统的其他用户显示其内容的话。

提示和注释

注释:本函数仅用于通过 HTTP POST 上传的文件。

注意:如果目标文件已经存在,将会被覆盖。

安全补充

来自w3c的介绍,下面说说我遇到的问题。

一般来说,我们都会这样写保存文件:

$fileName = $_SERVER['DOCUMENT_ROOT'].'/Basic/uploads/'.$_FILES['file']['name']; 
move_uploaded_file($_FILES['file']['tmp_name'],$fileName )

先解释,这两句代码的含义:直接保存文件,同时文件名也为用户上传的文件名
好了,这下子风险来了:

①直接保存文件。

这意味着不对文件进行任何识别,如果有用户上传了一段后台代码保存为jpg后缀或者其他,要是管理员一不注意将其以php映射,然后访问这个后台,- -结果可想而知,要是他在后台中执行删除所有数据库,整个网站直接GG。总之直接保存文件有很大风险。

②使用与用户文件名相同的文件名。

上述代码如果用户使用中文文件名,则会报错。

一牵涉到文件名,就牵涉到编码,要是文件名是英文+数字还好,如果包含中文那就头大了,要重新对其编码。

我认为可靠的保存,应该是这样的:

①要对用户上传的文件进行识别。

文件识别,这个部分有很多功能,我觉得用MIME type就很好,这个也很难伪造。

②要将文件名改换。

我觉得最好改成时间的格式像“201803264104421”这种文件名,也可以将文件名与数据库相对应起来。

补充:

有两个参数,第一个参数是你上传后的临时文件名,由系统自动生成。通常其样式为:

$_FILE["file"]["tmp_name"];

其中的file为你前台文件上传表单的名称。
第二个参数就是包含有路径的新的文件名。如:

"upload/1.jpg";

这样,就会把你上传的文件,移动到当前目录下名称upload的子目录下,并把文件名保存为:1.jpg。

move_uploaded_file()函数实例

使用move_uploaded_file()函数上传文件到服务器。

<?php
  $tmp_filename = $_FILES[&#39;myupload&#39;][&#39;tmp_name&#39;];
  if(!move_uploaded_file($tmp_filename,"/path/to/dest/{$_FILES[&#39;myupload&#39;][&#39;name&#39;]}")) {
   echo "An error has occurred moving the uploaded file.<BR>";
   echo "Please ensure that if safe_mode is on that the " . "UID PHP is using matches the file.";
   exit;
  } else {
   echo "The file has been successfully uploaded!";
  }
?>

move_uploaded_file上传文件失败的案例及解决方法

今天在实现一个在用户注册时上传头像图片文件的PHP脚本时,出现了问题:php脚本代码如下:

<?php 
define(&#39;ROOT&#39;,dirname(__FILE__).&#39;/&#39;); 
 if ($_FILES["file"]["error"] > 0) 
 { 
  echo "Return Code: " . $_FILES["file"]["error"] . "<br />"; 
 } 
 else 
 { 
  echo "Upload: " . $_FILES["file"]["name"] . "<br />"; 
  echo "Type: " . $_FILES["file"]["type"] . "<br />"; 
  echo "Size: " . ($_FILES["file"]["size"] / 1024) . " Kb<br />"; 
  echo "Temp file: " . $_FILES["file"]["tmp_name"] . "<br />"; 
  if (file_exists("upload/" . $_FILES["file"]["name"])) 
  { 
   echo $_FILES["file"]["name"] . " already exists. "; 
  } 
  else 
  { 
   if(is_uploaded_file($_FILES[&#39;file&#39;][&#39;tmp_name&#39;])){ 
    $stored_path = ROOT.&#39;/upload/&#39;.basename($_FILES[&#39;file&#39;][&#39;name&#39;]); 
     
    if(move_uploaded_file($_FILES[&#39;file&#39;][&#39;tmp_name&#39;],$stored_path)){ 
     echo "Stored in: " . $stored_path; 
    }else{ 
     echo &#39;Stored failed:file save error&#39;; 
    } 
   }else{ 
    echo &#39;Stored failed:no post &#39;; 
   } 
   } 
 } 
?>

当我执行执行上面的脚本时,脚本输出"Stored failed:file save error",很明显是出错了.在php_error_log文件中我看到了出错问题:权限不够,我终于找到了出错的地方:我们存放图片的目的目录对执行PHP的用户来说是没有权限的,执行PHP脚本的用户和我写脚本代码、创建图片文件夹的用户不是同一个用户,因此只需要将文件权限改为777即可。

PHP开发学习 文件上传(move_uploaded_file)

功能:把上传的临时文件移动到upload目录下面,upload是在根目录下已经创建好的!!!

<form action="" enctype="multipart/form-data" method="post" 
  name="uploadfile">上传文件:<input type="file" name="upfile" /><br> 
 <input type="submit" value="上传" /></form> 
<?php 
//print_r($_FILES["upfile"]); 
if(is_uploaded_file($_FILES[&#39;upfile&#39;][&#39;tmp_name&#39;])){ 
 $upfile=$_FILES["upfile"]; 
//获取数组里面的值 
 $name=$upfile["name"];//上传文件的文件名 
 $type=$upfile["type"];//上传文件的类型 
 $size=$upfile["size"];//上传文件的大小 
 $tmp_name=$upfile["tmp_name"];//上传文件的临时存放路径 
//判断是否为图片 
 switch ($type){ 
  case &#39;image/pjpeg&#39;:$okType=true; 
   break; 
  case &#39;image/jpeg&#39;:$okType=true; 
   break; 
  case &#39;image/gif&#39;:$okType=true; 
   break; 
  case &#39;image/png&#39;:$okType=true; 
   break; 
 } 
 
 if($okType){ 
  /** 
   * 0:文件上传成功<br/> 
   * 1:超过了文件大小,在php.ini文件中设置<br/> 
   * 2:超过了文件的大小MAX_FILE_SIZE选项指定的值<br/> 
   * 3:文件只有部分被上传<br/> 
   * 4:没有文件被上传<br/> 
   * 5:上传文件大小为0 
   */ 
  $error=$upfile["error"];//上传后系统返回的值 
  echo "================<br/>"; 
  echo "上传文件名称是:".$name."<br/>"; 
  echo "上传文件类型是:".$type."<br/>"; 
  echo "上传文件大小是:".$size."<br/>"; 
  echo "上传后系统返回的值是:".$error."<br/>"; 
  echo "上传文件的临时存放路径是:".$tmp_name."<br/>"; 
 
  echo "开始移动上传文件<br/>"; 
//把上传的临时文件移动到upload目录下面(upload是在根目录下已经创建好的!!!) 
  move_uploaded_file($tmp_name,"upload/".$name); 
  $destination="upload/".$name; 
  echo "================<br/>"; 
  echo "上传信息:<br/>"; 
  if($error==0){ 
   echo "文件上传成功啦!"; 
   echo "<br>图片预览:<br>"; 
   echo "<img src=".$destination.">"; 
//echo " alt=\"图片预览:\r文件名:".$destination."\r上传时间:\">"; 
  }elseif ($error==1){ 
   echo "超过了文件大小,在php.ini文件中设置"; 
  }elseif ($error==2){ 
   echo "超过了文件的大小MAX_FILE_SIZE选项指定的值"; 
  }elseif ($error==3){ 
   echo "文件只有部分被上传"; 
  }elseif ($error==4){ 
   echo "没有文件被上传"; 
  }else{ 
   echo "上传文件大小为0"; 
  } 
 }else{ 
  echo "请上传jpg,gif,png等格式的图片!"; 
 } 
} 
?>

执行结果:

以上就是本文的全部内容,希望对大家的学习有所帮助,更多相关内容请关注PHP中文网!

相关推荐:

ThinkPHP中类的构造函数_construct()与_initialize()的区别

Thinkphp 中 distinct 的用法

以上是PHP中的move_uploaded_file() 函数的详细内容。更多信息请关注PHP中文网其他相关文章!

声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
PHP中的依赖注入:避免常见的陷阱PHP中的依赖注入:避免常见的陷阱May 16, 2025 am 12:17 AM

DependencyInjection(DI)inPHPenhancescodeflexibilityandtestabilitybydecouplingdependencycreationfromusage.ToimplementDIeffectively:1)UseDIcontainersjudiciouslytoavoidover-engineering.2)Avoidconstructoroverloadbylimitingdependenciestothreeorfour.3)Adhe

如何加快PHP网站:性能调整如何加快PHP网站:性能调整May 16, 2025 am 12:12 AM

到Improveyourphpwebsite的实力,UsEthestertate:1)emplastOpCodeCachingWithOpcachetCachetOspeedUpScriptInterpretation.2)优化的atabasequesquesquesquelies berselectingOnlynlynnellynnessaryfields.3)usecachingsystemssslikeremememememcachedisemcachedtoredtoredtoredsatabaseloadch.4)

通过PHP发送大规模电子邮件:有可能吗?通过PHP发送大规模电子邮件:有可能吗?May 16, 2025 am 12:10 AM

是的,itispossibletosendMassemailswithp.1)uselibrarieslikeLikePhpMailerorSwiftMailerForeffitedEmailSending.2)enasledeLaysBetemailStoavoidSpamflagssspamflags.3)sylectynamicContentToimpovereveragement.4)

PHP中依赖注入的目的是什么?PHP中依赖注入的目的是什么?May 16, 2025 am 12:10 AM

DependencyInjection(DI)inPHPisadesignpatternthatachievesInversionofControl(IoC)byallowingdependenciestobeinjectedintoclasses,enhancingmodularity,testability,andflexibility.DIdecouplesclassesfromspecificimplementations,makingcodemoremanageableandadapt

如何使用PHP发送电子邮件?如何使用PHP发送电子邮件?May 16, 2025 am 12:03 AM

使用PHP发送电子邮件的最佳方法包括:1.使用PHP的mail()函数进行基本发送;2.使用PHPMailer库发送更复杂的HTML邮件;3.使用SendGrid等事务性邮件服务提高可靠性和分析能力。通过这些方法,可以确保邮件不仅到达收件箱,还能吸引收件人。

如何计算PHP多维数组的元素总数?如何计算PHP多维数组的元素总数?May 15, 2025 pm 09:00 PM

计算PHP多维数组的元素总数可以使用递归或迭代方法。1.递归方法通过遍历数组并递归处理嵌套数组来计数。2.迭代方法使用栈来模拟递归,避免深度问题。3.array_walk_recursive函数也能实现,但需手动计数。

PHP中do-while循环有什么特点?PHP中do-while循环有什么特点?May 15, 2025 pm 08:57 PM

在PHP中,do-while循环的特点是保证循环体至少执行一次,然后再根据条件决定是否继续循环。1)它在条件检查之前执行循环体,适合需要确保操作至少执行一次的场景,如用户输入验证和菜单系统。2)然而,do-while循环的语法可能导致新手困惑,且可能增加不必要的性能开销。

PHP中如何哈希字符串?PHP中如何哈希字符串?May 15, 2025 pm 08:54 PM

在PHP中高效地哈希字符串可以使用以下方法:1.使用md5函数进行快速哈希,但不适合密码存储。2.使用sha256函数提高安全性。3.使用password_hash函数处理密码,提供最高安全性和便捷性。

See all articles

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

北端:融合系统,解释
1 个月前By尊渡假赌尊渡假赌尊渡假赌
Mandragora:巫婆树的耳语 - 如何解锁抓钩
4 周前By尊渡假赌尊渡假赌尊渡假赌
<🎜>掩盖:探险33-如何获得完美的色度催化剂
2 周前By尊渡假赌尊渡假赌尊渡假赌

热工具

EditPlus 中文破解版

EditPlus 中文破解版

体积小,语法高亮,不支持代码提示功能

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

SublimeText3 英文版

SublimeText3 英文版

推荐:为Win版本,支持代码提示!

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用