尝试允许文件上传以及原本有效的表单。我删掉了相关的表单/输入/处理规则。希望对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, <5MB)</span></p>
</div>
<input type="hidden" name="formtype" id="formtype-quote" value="quote">
<div class="form_labels submit">
<p> </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手册页。