我的表单中有2个文件上传字段。它们看起来都像这样:
<input type="file" id="file1" name="file1" accept="application/pdf,application/msword">
<span id="file1_status">Currently uploaded: <?php echo $file1_fileName; ?></span>
<input type="file" id="file2" name="file2" accept="application/pdf,application/msword">
<span id="file2_status">Currently uploaded: <?php echo $file2_fileName; ?></span>
其中$file1/2_fileName;在首次加载页时为“none”,在post事件后等于$_FILES[“file 1/2”][“name”]。
在这一页的结尾,我知道
$(document).ready(function () {
jQuery("input#file1").change(function () {
var val = $(this).val();
_('file1_status').innerHTML = "Currently uploaded: " + val.substr(12); // removes C:/fakedir/
});
file 2也是如此。所以,基本上如果有人上传“file.pdf”,在文件输入下会有一段文本,内容如下:“当前上载:我这样做是为了让用户看到,如果表单提交后表单验证失败,该文件仍然存在。
目前为止还不错。
在提交表单时,我没有在输入文件字段中使用“required”,而是执行以下操作:
if (is_uploaded_file($_FILES["file1"]["tmp_name"])) {
// check mime_type, file size, etc.
} else {
// display an error below the input field that a file is missing.
}
file 2也是一样。现在来看看实际的问题。想象一下下面的情况。一个用户只上传了file 1,但忘记了file 2,然后点击submit。这是发生的事情:
Firefox(最新版本):在file 1字段下方,状态仍显示“当前已上载:file1.pdf”,并且在file 2输入字段下方显示错误消息,以提醒用户也上载此文件。如果用户遵从并上载file 2,然后再次单击submit,则表单被提交,并且一切正常,即两个文件都已附加到表单提交。这是预期行为。
选择/边缘:对于相同的用户行为,除了用户第二次单击提交时,其他一切都是相同的。由于某种原因,这两个浏览器现在都在file 1输入字段下显示错误(尽管它仍然显示“当前已上载:file.pdf”,用户在一开始就上传了)。因此,由于某种原因,尽管$_FILES[“file 1”][“tmp_name”]不为空,但在Chrome和Edge中,第二次提交表单时测试is_uploaded_file($_FILES["file1"]["tmp_name"])
失败,而在FF中则没有。
这是非常令人困惑的。为什么会这样,以及如何避免/修复这种情况?
1条答案
按热度按时间fjaof16o1#
看起来Edge/Chrome的行为确实是预期/正常的行为。令我非常尴尬的是,我已经无法在FF中重现上述行为了,所以我不太确定发生了什么,因为我在测试大约一个小时左右时确实看到了不同的行为。
无论如何,出于实际目的,我可以通过将满足所有标准(remime类型、文件大小等)的文件移动到服务器上的临时上载目录中,将文件名存储在会话变量中,并修改以下代码来解决这个问题:
到这个
file2也是如此。因此,当第一个"if"条件在第二次提交表单时失败时,"elseif"条件为真,不会发出错误。