php 不同的浏览器对输入类型文件显示不同的行为

2w3rbyxf  于 2022-12-25  发布在  PHP
关注(0)|答案(1)|浏览(129)

我的表单中有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中则没有。

这是非常令人困惑的。为什么会这样,以及如何避免/修复这种情况?

fjaof16o

fjaof16o1#

看起来Edge/Chrome的行为确实是预期/正常的行为。令我非常尴尬的是,我已经无法在FF中重现上述行为了,所以我不太确定发生了什么,因为我在测试大约一个小时左右时确实看到了不同的行为。
无论如何,出于实际目的,我可以通过将满足所有标准(remime类型、文件大小等)的文件移动到服务器上的临时上载目录中,将文件名存储在会话变量中,并修改以下代码来解决这个问题:

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.
}

到这个

if (is_uploaded_file($_FILES["file1"]["tmp_name"])) {
 // check mime_type, file size, and if OK move to upload directory on server and store the name of the successfully uploaded file in $_SESSION["file1"]
} elseif (!empty($_SESSION["file1"])) { //basically this gets invoked the second time round, i.e., when the user uploads the 2nd file they forgot when submitting the form for the first time
   $file1_fileName = $_SESSION["file1"]; // used to display under the input file element (see above)
} else {
 // display an error below the input field that a file is missing.
}

file2也是如此。因此,当第一个"if"条件在第二次提交表单时失败时,"elseif"条件为真,不会发出错误。

相关问题