PHP | move_uploaded_file 函数

Lasted 2021-01-19 12:48:06

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

本函数检查并确保由 filename 指定的文件是合法的上传文件(即通过 PHP 的 HTTP POST 上传机制所上传的)。如果文件合法,则将其移动为由 destination 指定的文件。这种检查非常重要,否则可能造成系统文件泄露。

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

函数定义

move_uploaded_file ( string $filename , string $destination ) : bool
// 源文件位于:ext/standard/basic_functions.c
# 函数定义

PHP_FUNCTION(move_uploaded_file)
{
  ...
  if (!SG(rfc1867_uploaded_files)) {
    RETURN_FALSE;
  }

  if (!zend_hash_str_exists(SG(rfc1867_uploaded_files), path, path_len)) {
    RETURN_FALSE;
  }

  if (php_check_open_basedir(new_path)) {
    RETURN_FALSE;
  }

  if (VCWD_RENAME(path, new_path) == 0) {
    successful = 1;
#ifndef PHP_WIN32
    oldmask = umask(077);
    umask(oldmask);

    ret = VCWD_CHMOD(new_path, 0666 & ~oldmask);

    if (ret == -1) {
      php_error_docref(NULL, E_WARNING, "%s", strerror(errno));
    }
#endif
  } else if (php_copy_file_ex(path, new_path, STREAM_DISABLE_OPEN_BASEDIR) == SUCCESS) {
    VCWD_UNLINK(path);
    successful = 1;
  }

  if (successful) {
    zend_hash_str_del(SG(rfc1867_uploaded_files), path, path_len);
  } else {
    php_error_docref(NULL, E_WARNING, "Unable to move \"%s\" to \"%s\"", path, new_path);
  }

  RETURN_BOOL(successful);
}

参数

  • checkfilename - 上传的文件的文件名。
  • checkdestination - 移动文件到这个位置。

返回值

  • checkbool - 成功时返回 true,失败时返回 false。

示例1: - 使用 move_uploaded_file() 函数移动上传的文件。

<?php
/**
 * PHP move_uploaded_file() 函数移动上传的文件。
 *
 * @since Version 1.0.0
 * @filesource
 */

// 移动上传文件
if($_FILES['file']['error'] == UPLOAD_ERR_OK) {
  move_uploaded_file($_FILES['file']['tmp_name'], "/uploads/pic.jpg");
}
注意:如果目标文件已经存在,将会被覆盖。