PHP 表单 - 文件上传不起作用


PHP Form - File upload not working

尝试允许文件上传以及原本有效的表单。我删掉了相关的表单/输入/处理规则。希望对PHP超过脚踝深的人(像我一样)可以指出我正确的方向?

<form name="form-quote" id="form-quote" enctype="multipart/form-data" action="<?php echo $_SERVER['../WPTheme/REQUEST_URI' . '#form-quote'] ?>" method="POST">
  <div class="form_labels">
    <p><label for="fileupload">Upload File (optional):</label></p>
  </div>
  <div class="form_inputs">
    <input type="hidden" name="MAX_FILE_SIZE" value="5242880" />
    <p><input type="file" name="fileupload" id="fileupload" accept=".pdf, .txt, .rtf, .doc, .docx, .xls, .xlsx" style="margin-bottom:2px;"/>
    <span style="color:#777;">(pdf, txt, rtf, doc, docx, xls, xlsx, &lt;5MB)</span></p>
  </div>
  <input type="hidden" name="formtype" id="formtype-quote" value="quote">
  <div class="form_labels submit">
    <p>&nbsp;</p>
  </div>
  <div class="form_inputs">
    <a href="javascript:void(0);"><input type="submit" value="Submit" name="action" class="btn-red" ></a>
  </div>
</form>
<?php
//$formerrors is set to false unless one of the validation rules for the OTHER fields fails - no validation on the file upload, although I would like to trim & sanitize it if possible.
if (!($formerrors) && isset($_POST['fileupload'])):
    $tmp_name = $_FILES["fileupload"]["temp_name"];
    $uploadfilename = $_FILES["fileupload"]["name"];
    $savedate = date("mdy-Hms");
    $newfilename = "/wp-content/uploads_forms/" . $savedate . "_" . $uploadfilename;
    $uploadurl = 'http://' . $_SERVER['SERVER_NAME'] . $newfilename;
    if (move_uploaded_file($tmp_name, $newfilename)):
        $msg = "File uploaded.";
    else: 
        $msg = "Sorry, your file could not be uploaded." . $_FILES['file']['error'];
        $formerrors = true;
    endif; //move uploaded file
endif;
?>

感谢亚历山大在下面的回答,我能够修改我的验证器以工作并实现我最初的目标(检查 null,并在上传之前为文件提供唯一名称)。这是我的"最终草案",现在正在工作。

//Check form errors, check file name not null, rename file with unique identifier to avoid overwriting existing files with same name
if (!($formerrors)) {
  $tmp_file = $_FILES["fileupload"]["tmp_name"];
  if ($tmp_file != "") {
    $savedate = date("mdy-Hms");
    $target_dir = "wp-content/uploads/";
    $target_file = $target_dir . $savedate . '_' . $_FILES["fileupload"]["name"];
    if (move_uploaded_file($tmp_file, $target_file)) {
      $msg = "File uploaded.";
    } else { 
      $msg = "Sorry, your file could not be uploaded.";
      $formerrors = true;
    }//move successful
  }//end null check
}//end form errors check

你上面使用的代码是Javascript。如果您依赖这一点,请更改帖子的标签。如果没有,这里有一个PHP-Uploadscript的可能性:

$target_dir = "uploads/";
$target_file = $target_dir . basename($_FILES["fileupload"]["name"]);
if (move_uploaded_file($_FILES["fileupload"]["tmp_name"], $target_file)) {
    echo "The file ". basename( $_FILES["fileupload"]["name"]). " has been uploaded.";
} else {
    echo "Sorry, there was an error uploading your file.";
}

来源: http://www.w3schools.com/php/php_file_upload.asp

编辑:上面的脚本已放置在从表单接收POST的文件中。

你发布的代码一团糟!
让我们尝试澄清一些基本点...

文件上传机制

要使文件上传正常工作,您必须有一个具有action属性的<form>,用于处理脚本,您将在其中检查和使用上传的文件。
此脚本可能与生成<form>的脚本相同,前提是您处理了这种情况带来的陷阱。

乍一看,您当前的代码似乎对应于后一种情况。
但是你的形式action看起来很奇怪:

action="<?php echo $_SERVER['../WPTheme/REQUEST_URI' . '#form-quote'] ?>"

作为第一个意图,如果要寻址已有的同一页面,只需省略action属性即可。
在这里,您似乎明确地尝试了相同的方法,增加了#form-quote的精度,但是:

  • #form-quote在这里没有影响,因为这样的哈希是针对<a> ,而它目前对您的<form>有影响。
  • 您构建的 url 的另一部分是将REQUEST_URI(这是$_SERVER成员之一的名称)与上下文中路径的核心表达式混合在一起的无意义混合。
  • 无论如何,以上所有内容都无关紧要,因为这以 $_SERVER[...something which is not a known $_SERVER member...] 结尾,所以它实际上返回 NULL ,有点讽刺的是,它的效果与您根本没有指定action相同!

SO 代码段中的 PHP

所以你把你的代码放在一个片段中,但SO片段只适用于HTML,CSS和Javascript,所以你不能指望它允许演示你的代码是如何工作的。

请注意,在此步骤中,尽管存在上述错误,但我们没有指出会使代码失败的内容。
在你的问题中,你没有提到它是如何失败的!

上传的文件处理

所以看看你的PHP代码部分,我首先注意到这个语句:

$tmp_name = $_FILES["fileupload"]["temp_name"];

您要查找temp_name,而真正涉及的密钥是tmp_name 。仅此一项就足以使您的代码失败。

进一步查看这两个陈述:

$uploadurl = 'http://' . $_SERVER['SERVER_NAME'] . $newfilename;
if (move_uploaded_file($tmp_name, $newfilename))

在第一个中,您使用$newfilename作为您正在构建的 url 的补充,因此显然$newfilename不能针对绝对物理路径。
这意味着在第二个中,您试图move_uploaded_file()到错误的地方!

最后一点,在尝试使用上传的文件之前,您目前没有处理可能的错误。
您应该像这样完成您的主要条件:

if (!($formerrors) && isset($_POST['fileupload'])) && !$_FILES["fileupload"]["error"])

如果你有效地得到一些错误并且难以理解为什么,你也应该看看这个有趣的PHP手册页。