PHP:实际文件上传的代码是什么?

时间:2014-03-30 23:41:12

标签: php file-upload

我正在阅读this php book,我正在进行所有练习。

但是这个我得不到。这是一个HTML表单的示例,允许用户(具有适当的权限)上传文件。

我已经查找了示例中提到的allphp函数,但无法理解实际上传文件的位置。

这些书应该在/ uploads目录里面:

  // put the file where we'd like it
  $upfile = '/uploads/'.$_FILES['userfile']['name'];

但无法理解,因为它只是为变量赋值......在该行中没有“上传”功能......是吗?

HTML表格:

<h1>Upload new news files</h1>
<form enctype="multipart/form-data" action="upload.php" method=post>
  <input type="hidden" name="MAX_FILE_SIZE" value="1000000">
  Upload this file: <input name="userfile" type="file">
  <input type="submit" value="Send File">
</form>

PHP文件:

<body>
<h1>Uploading file...</h1>
<?php

//Check to see if an error code was generated on the upload attempt
  if ($_FILES['userfile']['error'] > 0)
  {
    echo 'Problem: ';
    switch ($_FILES['userfile']['error'])
    {
      case 1:   echo 'File exceeded upload_max_filesize';
                break;
      case 2:   echo 'File exceeded max_file_size';
                break;
      case 3:   echo 'File only partially uploaded';
                break;
      case 4:   echo 'No file uploaded';
                break;
      case 6:   echo 'Cannot upload file: No temp directory specified.';
                break;
      case 7:   echo 'Upload failed: Cannot write to disk.';
                break;
    }
    exit;
  }

  // Does the file have the right MIME type?
  if ($_FILES['userfile']['type'] != 'text/plain')
  {
    echo 'Problem: file is not plain text';
    exit;
  }

  // put the file where we'd like it
  $upfile = '/uploads/'.$_FILES['userfile']['name'];

  if (is_uploaded_file($_FILES['userfile']['tmp_name'])) 
  {
     if (!move_uploaded_file($_FILES['userfile']['tmp_name'], $upfile))
     {
        echo 'Problem: Could not move file to destination directory';
        exit;
     }
  } 
  else 
  {
    echo 'Problem: Possible file upload attack. Filename: ';
    echo $_FILES['userfile']['name'];
    exit;
  }


  echo 'File uploaded successfully<br><br>'; 

  // reformat the file contents
  $fp = fopen($upfile, 'r');
  $contents = fread ($fp, filesize ($upfile));
  fclose ($fp);

  $contents = strip_tags($contents);
  $fp = fopen($upfile, 'w');
  fwrite($fp, $contents);
  fclose($fp);

  // show what was uploaded
  echo 'Preview of uploaded file contents:<br><hr>';
  echo $contents;
  echo '<br><hr>';

?>
</body>

2 个答案:

答案 0 :(得分:2)

PHP会为您上传。

您需要管理的是将上传的文件从临时文件夹移动到您想要的位置(使用move_uploaded_file功能执行此操作)。

if(!move_uploaded_file(...条件会尝试将文件移动到文件夹,如果失败(主要是因为权限问题),将执行if中的代码。

请注意,您的代码可以通过XSS进行利用:

echo 'Problem: Possible file upload attack. Filename: ';
echo htmlentities($_FILES['userfile']['name']);
exit;

另请注意,任何人都可以上传任何PHP脚本并弄乱您的服务器,不要在生产环境中使用此脚本。

在移动文件之前,你必须检查它的mime类型,它的扩展名,最好把它移动到apache无法解释的地方。

答案 1 :(得分:1)

PHP在您提交表单时收到该文件。假设您的enctype标记中有<form>属性,如下所示,浏览器会将文件发送到服务器以供PHP处理。

<form enctype="multipart/form-data">

PHP从浏览器接收文件,并将其存储在php.ini中配置的临时位置。

然后是验证上传文件并使用$_FILES['userfile']['tmp_name']临时名称将其移至新位置的情况。

然后使用move_uploaded_file()函数而不是复制文件或使用copy()rename()移动它,因为函数检查以确保文件是通过PHP的HTTP上传的POST上传机制,作为安全措施。

即使您没有编写任何代码来处理上传,它仍然会发生,并且文件存储在临时目录中以备处理。总而言之,上传是由PHP自动完成的。