2

我目前有下面的代码块处理用户上传文件的表单。如果用户上传了 fgetcsv 无法处理的文件,我如何让它返回错误?现在,当我尝试让它处理图像时,我的脚本继续运行并且我从未收到错误消息。

我尝试测试 $data 以确定它是否为空,但我得到的只是错误。

if (($handle = fopen($_FILES['fileUpload']['tmp_name'], 'r')) !== FALSE) {
    while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
        $total = count($data);

        for ($e=0; $e < $total; $e++) {
            echo $data[$e] . "<br />";
        }
        echo "<br />";
    }
    fclose($handle);
}

作为一个仅供参考 - 我只是为了测试目的打印出 csv 内容。在最终脚本中,我将只将数组保存在会话中。

更新: 正如@hakre 建议的那样,我问了错误的问题。我已经接受了他的回答,因为我遇到了麻烦并且我不完全理解它,所以我将其修改为您在下面看到的内容。

一切都很好,除了线路if ($row === null) continue;不起作用。我已经尝试过使用和不使用括号null。空行是在文件中间还是最后一行似乎并不重要。这是根据@harke 评论修复的。 if ($row === null) continue;被替换为if ($row === array(null)) continue;

$uploadTempfile = $_FILES['fileUpload']['tmp_name'];
$file = new SplFileObject($uploadTempfile);
$file->setFlags(SplFileObject::READ_CSV);
$limit = new LimitIterator($file, 0, 10); // scan the first 10 lines only
foreach ($limit as $row) {
    if ($row === array(null)) continue; // skip empty lines
    $columnCount[] = count($row);
    }
if(count(array_unique($columnCount)) === 1){
    echo 'file is valid';
    } else {
    echo 'file is INVALID';
    }

我已经根据下面的评论和答案更新了上面的代码块,以便它现在可以正常工作。

4

1 回答 1

2

如果用户上传了 fgetcsv 无法处理的文件,我如何让它返回错误?

那可能是个错误的问题。fgetcsv可以处理任何文件。因此,这始终是正确的,这样的函数将始终返回成功,而不是错误。

您可能的意思是您想要检查 CSV 文件并在某种程度上验证它的内容,如果它可能是您正在寻找的这种 CSV 文件。

这还需要您明确文件是否实际上应该具有某种特定性质,例如始终相同数量的列,这可能是您正在寻找的。

以下代码示例检查 CSV 文件的前 10 行是否至少包含一行,这 10 行中的每一行(如果不为空)都具有完全相同的计数并且计数大于 1:

$uploadTempfile = $_FILES['fileUpload']['tmp_name'];

$file = new SplFileObject($uploadTempfile);
$file->setFlags(SplFileObject::READ_CSV);

$limit = new LimitIterator($file, 0, 10); // scan the first 10 lines only

foreach ($limit as $row) {

    if ($row === [null]) continue; // skip empty lines

    $rowCount = count($row);

    if (!isset($count)) {
        $count = $rowCount;
    }

    if ($rowCount !== $count) {
        break;
    }
}

$valid = (isset($count) and $rowCount === $count and $count > 1);
于 2012-12-31T17:03:25.023 回答