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['myupload']['tmp_name'];
  if(!move_uploaded_file($tmp_filename,"/path/to/dest/{$_FILES['myupload']['name']}")) {
   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('ROOT',dirname(__FILE__).'/');
 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['file']['tmp_name'])){
    $stored_path = ROOT.'/upload/'.basename($_FILES['file']['name']); 

    if(move_uploaded_file($_FILES['file']['tmp_name'],$stored_path)){
     echo "Stored in: " . $stored_path;
    }else{
     echo 'Stored failed:file save error';
    }
   }else{
    echo 'Stored failed:no post ';
   }
   }
 }
?>

当我执行执行上面的脚本时,脚本输出"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['upfile']['tmp_name'])){
 $upfile=$_FILES["upfile"];
//获取数组里面的值
 $name=$upfile["name"];//上传文件的文件名
 $type=$upfile["type"];//上传文件的类型
 $size=$upfile["size"];//上传文件的大小
 $tmp_name=$upfile["tmp_name"];//上传文件的临时存放路径
//判断是否为图片
 switch ($type){
  case 'image/pjpeg':$okType=true;
   break;
  case 'image/jpeg':$okType=true;
   break;
  case 'image/gif':$okType=true;
   break;
  case 'image/png':$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等格式的图片!";
 }
}
?> 

执行结果:

好了这篇文章就介绍到这了,希望大家以后多多支持我们。

(0)

相关推荐

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

    定义和用法 move_uploaded_file() 函数将上传的文件移动到新位置. 若成功,则返回 true,否则返回 false. 语法 move_uploaded_file(file,newloc) 参数 描述 file 必需.规定要移动的文件. newloc 必需.规定文件的新位置. 说明 本函数检查并确保由 file 指定的文件是合法的上传文件(即通过 PHP 的 HTTP POST 上传机制所上传的).如果文件合法,则将其移动为由 newloc 指定的文件. 如果 file 不是合法

  • JS自定义函数对web前端上传的文件进行类型大小判断

    废话不多说了直接给大家贴js代码了.具体代码如下所示: <!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> <me

  • PHP实现上传多文件示例代码

    上传多文件 1.在对多文件信息进行操作前,需要构建文件信息,通过buildInfo函数将三维数组转换成便于文件操作的二维数组. function buildInfo(){ $i = 0; foreach ($_FILES as $v){ //判断是否是单文件 if(is_string($v['name'])){ $files[$i] = $v; $i++; }else{ //多文件 foreach ($v['name'] as $key => $value){ $files[$i]['name'

  • linux文件上传,给文件或目录添加apache权限的方法

    在LAMP环境中,测试一个简单的php文件上传功能时,发现/var/log/apache2/error.log中出现如下php警告: 1. [Tue Jan 31 09:40:27 2012] [error] [client 127.0.0.1] PHP Warning: move_uploaded_file(/home/leotody/32883679.jpeg): failed to open stream: Permission denied in /var/www/upload_file

  • windows2008+iis7无组件上传写入文件失败ADODB.Stream 错误 800a0bbc问题

    现象:写入文件失败,ADODB.Stream 错误 800a0bbc 条件:在已排除一般的解决方法文件夹权限后,并且服务器为windows2008 希望写这文章可以让大家避免浪费太多时间,最快地解决问题. 一个ASP程序用到无组件上传,在本地XP SP3 IIS5.1及在Windows Server 2003 + IIS6.0上测试均为可以正常上传.到把程序放了windows2008+IIS7.0上发现内部服务器错误500,最后我把其调为可显示详细错误信息,显示为: 写入文件失败,ADODB.S

  • php实现将上传word文件转为html的方法

    本文实例讲述了php实现将上传word文件转为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

  • php上传大文件失败的原因及应对策略

    为什么上传大文件总是失败,但是上传小文件就没有问题.小编也不得其解,网上搜其原因,整理了一篇关于php上传大文件失败的原因和解决办法的文章,分享给大家. 下面分别是各种原因以及解决办法: 第1种情况:文件上传时存放文件的临时目录必须是开启的并且是 PHP 进程所有者用户可写的目录.如果未指定则 PHP 使用系统默认值. php.ini文件中upload_tmp_dir用来说明PHP上传的文件放置的临时目录,要想上传文件,得保证服务器没有关闭临时文件并对该文件夹有写入的权限. 第2种情况:max_

  • python实现的简单FTP上传下载文件实例

    本文实例讲述了python实现的简单FTP上传下载文件的方法.分享给大家供大家参考.具体如下: python本身自带一个FTP模块,可以实现上传下载的函数功能. #!/usr/bin/env python # -*- coding: utf-8 -*- from ftplib import FTP def ftp_up(filename = "20120904.rar"): ftp=FTP() ftp.set_debuglevel(2) #打开调试级别2,显示详细信息;0为关闭调试信息

  • jquery uploadify如何取消已上传成功文件

    如何使用uploadify进行文件上传,各位都能够在网上找到,但是需要注意版本号.我这里仅仅说一下,在文件已经成功上传到服务器之后,如何取消文件的上传. 我使用的是自动上传,即将'auto'属性设置为true. 1.首先我们要设置cancelmg属性,即设置文件上传成功后,显示在文件上的关闭图片.这里需要修改对应CSS中的代码 .uploadify-queue-item .cancel a { background: url('../img/uploadify-cancel.png') 0 0

  • SWFUpload多文件上传及文件个数限制的方法

    本文实例讲述了SWFUpload多文件上传及文件个数限制的方法.分享给大家供大家参考,具体如下: SWFUpload是一个基于flash与JavaScript的客户端文件上传组件. handlers.js文件 完成文件入列队(fileQueued) → 完成选择文件(fileDialogComplete) → 开始上传文件(uploadStart) → 上传处理(uploadProgress) → 上传成功(uploadSuccess) → 上传完成(uploadComplete)  → 列队完

随机推荐