如何检查用户是否在PHP中上传了文件?

Cli*_*ote 53 php

我做了一些表单验证,以确保用户上传的文件类型正确.但上传是可选的,所以我想跳过验证,如果他没有上传任何内容并提交表格的其余部分.我如何检查他是否上传了某些内容?会$_FILES['myflie']['size'] <=0工作吗?

kar*_*m79 127

你可以使用is_uploaded_file():

if(!file_exists($_FILES['myfile']['tmp_name']) || !is_uploaded_file($_FILES['myfile']['tmp_name'])) {
    echo 'No upload';
}
Run Code Online (Sandbox Code Playgroud)

来自文档:

如果通过HTTP POST上传由filename命名的文件,则返回TRUE.这有助于确保恶意用户没有试图欺骗脚本处理不应该工作的文件 - 例如/ etc/passwd.

如果对上传文件所做的任何事情都有可能向用户或甚至同一系统上的其他用户显示其内容,则此类检查尤其重要.

编辑:我在我的FileUpload类中使用它,以防它有帮助:

public function fileUploaded()
{
    if(empty($_FILES)) {
        return false;       
    } 
    $this->file = $_FILES[$this->formField];
    if(!file_exists($this->file['tmp_name']) || !is_uploaded_file($this->file['tmp_name'])){
        $this->errors['FileNotExists'] = true;
        return false;
    }   
    return true;
}
Run Code Online (Sandbox Code Playgroud)

  • 请注意,如果你正在使用数组,例如`name = files []`这会导致错误`file_exists()期望参数1是一个有效路径,给定数组`你必须更深入地看看`$ _FILES [ 'files'] ['tmp_name'] [0]`为空/上传. (5认同)

小智 10

这段代码对我有用.我正在使用多个文件上传,所以我需要检查是否有任何上传.

HTML部分:

<input name="files[]" type="file" multiple="multiple" />
Run Code Online (Sandbox Code Playgroud)

PHP部分:

if(isset($_FILES['files']) ){  


foreach($_FILES['files']['tmp_name'] as $key => $tmp_name ){

      if(!empty($_FILES['files']['tmp_name'][$key])){

    //  things you want to do
    }
}
Run Code Online (Sandbox Code Playgroud)


dou*_*ack 9

@ karim79有正确的答案,但我不得不重写他的例子以适应我的目的.他的例子假设提交的字段的名称是已知的并且可以被硬编码.我更进了一步并且创建了一个函数,它将告诉我是否上传了任何文件而不必知道上传字段的名称.

/**
 * Tests all upload fields to determine whether any files were submitted.
 * 
 * @return boolean
 */
function files_uploaded() {

    // bail if there were no upload forms
   if(empty($_FILES))
        return false;

    // check for uploaded files
    $files = $_FILES['files']['tmp_name'];
    foreach( $files as $field_title => $temp_name ){
        if( !empty($temp_name) && is_uploaded_file( $temp_name )){
            // found one!
            return true;
        }
    }   
    // return false if no files were found
   return false;
}
Run Code Online (Sandbox Code Playgroud)