如何防止PHP上的html表单上的空文件

时间:2015-02-22 21:26:25

标签: php html multipartform-data

我有一个网站,用户填写表格并上传他们的简历(简历)。 95%的时间它应该工作,我得到服务器上的CV文件。虽然我尝试过,但我永远无法重现失败的5%用户的错误。我知道他们中的大多数都使用Android上传文件但不是全部。我们甚至让在Windows 7上运行的Chrome上的人失败,因此问题可能是连接不良。我仍然无法重现错误。

这是表单的简化版本:

<html>
    <form action="get_file.php" method="POST" enctype="multipart/form-data">
        Here goes the file: <input name="curriculo" type="file"><br>
        <input type="submit">
    </form>
</html>

这是我在后端的简化版本。

<pre>
<?php
print_r($_FILES);
?>
</pre>

这是我95%的时间得到的,这很好:

Array
(
    [curriculo] => Array
        (
            [name] => cora.rtf
            [type] => application/msword
            [tmp_name] => /tmp/phpk0caxk
            [error] => 0
            [size] => 542
        )
)

这是另外5%(不好!)

Array
(
    [curriculo] => Array
        (
            [name] => 
            [type] => 
            [tmp_name] => 
            [error] => 4
            [size] => 0
        )

)

Array
(
    [curriculo] => Array
        (
            [name] => curriculo.odt
            [type] => 
            [tmp_name] => 
            [error] => 3
            [size] => 0
        )

)
Array
(
    [curriculo] => Array
        (
            [name] => jeisuana_almeida_de_sousa_jeise.pdf
            [type] => application/pdf
            [tmp_name] => /tmp/php7QmGOk
            [error] => 0
            [size] => 0
        )

)

在最后一个例子中,请注意该文件没有任何错误,但大小为0,这也是一个问题。

我在php.ini上有这个:

file_uploads = On
upload_max_filesize = 6M
max_file_uploads = 20

我知道如果文件大小超过了upload_max_filesize,那么该文件并没有。事实并非如此。当文件超过6M时,$ _FILES数组为空,我会相应地处理此错误。

我也知道这些错误代码是什么。它们记录在这里。

http://php.net/manual/en/features.file-upload.errors.php

我的问题是:为了防止丢失5%的简历,我有什么遗漏吗?任何配置?或者可能是问题肯定是用户糟糕的连接?

就像我说的那样,我在Android / Chrome / Safari / Firefox / Windows / Mac上的用户都会收到此错误。

谢谢!

2 个答案:

答案 0 :(得分:1)

为什么不在做任何事情之前测试文件大小?类似的东西:

<?php
if (isset($_FILES) && $_FILES['size'] > 0) {
  // Do stuff here
}
?>

答案 1 :(得分:1)

不使用传统的<form>type="submit"按钮,而是使用AJAX并在未收到文件的情况下提供即时反馈。

如果您之前没有使用过AJAX,那么这里有一些很好的帖子可以获得基础知识。 很多 比听起来容易。

A simple example

More complicated example

Populate dropdown 2 based on selection in dropdown 1


另外,查看Ravishanker Kusuma的Hayageek jQuery文件上传插件:

http://hayageek.com/docs/jquery-upload-file.php

他将这个过程分解为三个简单的步骤,基本上看起来像这样:

<head>
    <link href="http://hayageek.github.io/jQuery-Upload-File/uploadfile.min.css" rel="stylesheet">  // (1)
    <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
    <script src="http://hayageek.github.io/jQuery-Upload-File/jquery.uploadfile.min.js"></script>   // (1)
</head>
<body>
    <div id="fileuploader">Upload</div>  // (2)
    <script>
        $(document).ready(function(){
            $("#fileuploader").uploadFile({  // (3)
                url:"my_php_processor.php",
                fileName:"myfile"
            });
        });
    </script>
</body>

最后一步是在jQuery代码中指定PHP文件(在本例中为my_php_processor.php)来接收和处理文件:

<强> my_php_processor.php:

<?php
    $output_dir = "uploads/";
    $theFile = $_FILES["myfile"]["name"];
    move_uploaded_file($_FILES["myfile"]["tmp_name"],$output_dir.$fileName);

注意PHP(myfile)中$_FILES["myfile"]与jQuery代码块中指定的文件名之间的关系。