PHP | move_uploaded_file 函數

怎樣移動上傳的文件

最近更新時間 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");
}
注意:如果目標文件已經存在,將會被覆蓋。
rss_feed