PHP文件上传限制大小和最佳做法

时间:2015-05-23 14:16:47

标签: javascript php html file email

我有一个网站,我正在尝试使用可上传文件的表单 从用户计算机中选择。当他们点击表单上的提交按钮时,它应该通过电子邮件将他们填写的数据发送给我,并将文件上传到我服务器上的文件夹中。这是我到目前为止所得到的:

HTML页面的表单部分:

   <form class="registration-form" id="contact-form" action="upload_file.php" method="post" enctype="multipart/form-data">
      <input type="text" id="cf-name" name="name" class="form-test input-box" placeholder="Name">
      <input type="email" id="cf-email" name="email" class="form-test input-box" placeholder="Email">
      <input type="text" class="form-test bfh-address" placeholder="Address">
      <textarea name="message" id="cf-message" class="form-test textarea-box" rows="4" placeholder="Please enter your description"></textarea>
      <input type="file">
      <br>
      <button class="btn btn-primary standard-button" type="submit" name="submit" value="Submit">Upload</button>
   </form>

PHP脚本:

  <?php

$allowedExts = array("jpg", "jpeg", "gif", "png", "mp3", "mp4", "wma", "zip", "rar", "7zip", "avi", "mov", "wmv", "div");
$extension = pathinfo($_FILES['file']['name'], PATHINFO_EXTENSION);

if ((($_FILES["file"]["type"] == "video/mp4")
|| ($_FILES["file"]["type"] == "video/avi")
|| ($_FILES["file"]["type"] == "video/mov")
|| ($_FILES["file"]["type"] == "video/wmv")
|| ($_FILES["file"]["type"] == "video/div")
|| ($_FILES["file"]["type"] == "compressed/zip")
|| ($_FILES["file"]["type"] == "compressed/rar")
|| ($_FILES["file"]["type"] == "compressed/7zip")
|| ($_FILES["file"]["type"] == "audio/mp3")
|| ($_FILES["file"]["type"] == "audio/wma")
|| ($_FILES["file"]["type"] == "image/pjpeg")
|| ($_FILES["file"]["type"] == "image/gif")
|| ($_FILES["file"]["type"] == "image/jpeg"))

&& ($_FILES["file"]["size"] < 6000000)
&& in_array($extension, $allowedExts))

  {
  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
      {
      move_uploaded_file($_FILES["file"]["tmp_name"],
      "upload/" . $_FILES["file"]["name"]);
      echo "Stored in: " . "upload/" . $_FILES["file"]["name"];
      }
    }
  }
else
  {
  echo "Invalid file";
  }
?>

我还有其他一些问题: 1.由于服务器的存储限制,如何通过反复上传大文件来阻止人们试图填满服务器空间? 2.有没有办法在点击提交时简单地将字段内容和上传文件的名称通过电子邮件发送到电子邮件地址。 3.有没有办法将文件上传到服务器外的位置,例如将其上传到大型网站或其他网站以便安全存储?

以下是php脚本中的一些错误: http://postimg.org/image/qv2rg9qft/

2 个答案:

答案 0 :(得分:0)

  

当他们点击表单上的提交按钮时,它应该通过电子邮件向我发送填写在字段中的数据,并将文件上传到我服务器上的文件夹。

// ...
echo "Stored in: " . "upload/" . $_FILES["file"]["name"];
mail("your@email.com", "Subject", "Text", "From: sender <sender@email.com>");
// ...
  
      
  1. 由于服务器存储限制,如何通过反复上传大文件来阻止人们试图填满服务器空间?
  2.   

制作一个CAPTCHA,例如reCAPTCHA

  
      
  1. 当点击提交时,是否有办法简单地将字段内容和上传文件的名称通过电子邮件发送到电子邮件地址。
  2.   

是。使用PHPMailer作为附件是一个非常简单的解决方案。

  
      
  1. 有没有办法将文件上传到非服务器位置,例如将其上传到大型网站或其他网站以便安全存储?
  2.   

例如,FTPAmazon S3可能存在。

答案 1 :(得分:0)

要修复错误,您必须为您的html文件元素提供您在$ _FILES数组中使用的确切名称:

所以你的完整HTML代码如下:

<form class="registration-form" id="contact-form" action="upload_file.php" method="post" enctype="multipart/form-data">
  <input type="text" id="cf-name" name="name" class="form-test input-box" placeholder="Name">
  <input type="email" id="cf-email" name="email" class="form-test input-box" placeholder="Email">
  <input type="text" class="form-test bfh-address" placeholder="Address">
  <textarea name="message" id="cf-message" class="form-test textarea-box" rows="4" placeholder="Please enter your description"></textarea>
  <input type="file" name="file">
  <br>
  <button class="btn btn-primary standard-button" type="submit" name="submit" value="Submit">Upload</button>

为防止人们反复上传大文件,您可以实现像phpcaptcha这样的验证码脚本。 https://www.phpcaptcha.org/

上传到mega或任何其他公共文件服务也是一个不错的选择。请查看http://julien-marchand.fr/blog/using-the-mega-api-with-php-examples/以获取使用php上传到mega的示例。但是,根据您对文件的处理方式,我不建议您这样做,因为您在以后无法灵活地向客户端显示或部署这些文件。

对于电子邮件服务,我建议使用swiftmailer:http://swiftmailer.org。它是目前从php发送电子邮件的最佳方式。