PHP表单 - 文件上传无效

时间:2016-03-11 19:20:40

标签: javascript php forms file-upload

尝试允许文件上传以及其他方式正常工作的表单。我删除了相关的表格/输入/处理规则。希望有人在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;

?>

感谢Alexander在下面的回答,我能够修改我的验证器以实现我的原始目标(检查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

2 个答案:

答案 0 :(得分:0)

您上面使用的代码是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的文件中。

答案 1 :(得分:0)

你发布的代码很乱!
让我们试着澄清一些基本观点......

文件上传机制

要让文件上传工作,您必须拥有一个<form> action属性,用于查找您要检查并使用上传文件的脚本。
此脚本可能与生成<form>的脚本相同,假设您处理此情况带来的陷阱。

初看起来,您当前的代码似乎与后一种情况相符 但是您的表单action看起来很奇怪:

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

作为第一个意图,如果您想要找到您已经存在的同一页面,您可以简单地省略action属性。
在这里,您似乎明确地尝试相同,添加#form-quote的精度,但是:

  • #form-quote此处不起作用,因为此类哈希定位于<a>,而目前它对您的<form>有影响。
  • 您构建的网址的另一部分是非核心混合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作为您正在构建的网址的补充,因此显然$newfilename无法定位绝对物理路径。
这意味着在第二个尝试move_uploaded_file()到错误的地方!

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

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

如果你有效地犯了一些错误并且无法理解原因,那么你也应该看看this interesting PHP manual page