如何测试用户是不是选择了要上传的文件?

Posted

技术标签:

【中文标题】如何测试用户是不是选择了要上传的文件?【英文标题】:How to test if a user has SELECTED a file to upload?如何测试用户是否选择了要上传的文件? 【发布时间】:2011-02-26 20:11:00 【问题描述】:

在一个页面上,我有:

if (!empty($_FILES['logo']['name'])) 
    $dossier     = 'upload/';
    $fichier     = basename($_FILES['logo']['name']);
    $taille_maxi = 100000;
    $taille      = filesize($_FILES['logo']['tmp_name']);
    $extensions  = array('.png', '.jpg', '.jpeg');
    $extension   = strrchr($_FILES['logo']['name'], '.');

    if(!in_array($extension, $extensions)) 
        $erreur = 'ERROR you  must upload the right type';
    

    if($taille>$taille_maxi) 
         $erreur = 'too heavy';
    

    if(!empty($erreur)) 
      // ...
    

问题是,如果用户想在不上传LOGO的情况下编辑信息,则会引发错误:'error you must upload the right type'

所以,如果用户没有在输入框中输入任何内容来上传它,我不想进入这些条件测试。

我测试过: if (!empty($_FILES['logo']['name'])if (isset($_FILES['logo']['name'])

但两者似乎都不起作用。

有什么想法吗?

编辑:也许我不太清楚,我不想测试他是否上传了徽标,我想测试他是否选择了要上传的文件,因为现在,如果他没有选择文件要上传,php 会报错,告诉他必须以正确的格式上传。

谢谢。

【问题讨论】:

【参考方案1】:

您可以通过以下方式检查:

if (empty($_FILES['logo']['name'])) 
    // No file was selected for upload, your (re)action goes here

或者您可以使用 javascript 构造,仅当上传字段的值不是空字符串 ("") 时才启用上传/提交按钮,以避免在根本不上传的情况下提交表单。

【讨论】:

这就是我想要的。谢谢... +1 提问和回答。 (y)【参考方案2】:

php 文档中有一段关于file handling。您将find 可以检查各种错误,其中之一是

UPLOAD_ERR_OK
    Value: 0; There is no error, the file uploaded with success.
<...>
UPLOAD_ERR_NO_FILE
    Value: 4; No file was uploaded.

在您的情况下,您需要类似的代码

if ($_FILES['logo']['error'] == UPLOAD_ERR_OK)  ... 

if ($_FILES['logo']['error'] != UPLOAD_ERR_NO_FILE)  ... 

您还应该考虑检查(并可能为用户提供适当的响应)其他各种错误。

【讨论】:

@Tristan 睁开眼睛看看:值:4; 没有上传文件 @Col。弹片哎呀,确实,对不起,也许是我戴眼镜的时候了;p 我自己检查了这个。这确实是检查这种情况的正确方法。另请注意:“如果您的表单中没有选择要上传的文件,PHP 将返回 $_FILES['userfile']['size'] 为 0,并且 $_FILES['userfile']['tmp_name'] 为无。” (来自 PHP 文档)php.net/manual/en/features.file-upload.post-method.php【参考方案3】:

您应该使用is_uploaded_file($_FILES['logo']['tmp_name']) 来确保文件确实是通过 POST 上传的。

【讨论】:

我在我的帖子中添加了一些信息。如果你能看看它。谢谢【参考方案4】:

我会测试if (@987654321@($_FILES['logo']['tmp_name'])) 看看它是否有效。

或者,更恰当地说(感谢 Baloo):if (@987654322@($_FILES['logo']['tmp_name']))

【讨论】:

我在我的帖子中添加了一些信息。如果你能看看它。谢谢【参考方案5】:

我们可以使用

对于单个文件:

if ($_FILES['logo']['name'] == "") 
    // No file was selected for upload, your (re)action goes here

对于多个文件:

if ($_FILES['logo']['tmp_name'][0] == "") 
    // No files were selected for upload, your (re)action goes here

【讨论】:

【参考方案6】:
if ($_FILES['logo']['error'] === 0)

是唯一正确的方法

【讨论】:

这与 PHP 文档的说明相反。如果文件成功上传,这实际上将评估为 true。 php.net/manual/en/features.file-upload.errors.php

以上是关于如何测试用户是不是选择了要上传的文件?的主要内容,如果未能解决你的问题,请参考以下文章

如何测试文件是不是上传到控制器中?

如何测试以查看自定义上传器是不是有效?

php一句话木马上传时<?php被过滤了要怎么破

如何使“上传文件”不是必需的 - Laravel 8

jmeter 并发上传不同的文件

如何上传图片为url,而不是文件?