上传并显示大CSV文件

时间:2014-09-12 22:13:24

标签: php csv

我有一个脚本,可以将CSV文件上传并显示到HTML表格中。 我的问题是当我尝试打开大文件时出错。 我的文件大约是4.5 Mo,有80000行。它适用于小文件,但我得到了

  

警告:fopen(upload / test.csv):无法打开流:第45行/ var / www / cvs / PHP charts / sb-admin-v2 / test.php中没有此类文件或目录

有大文件 这是我的代码

<form action="<?php echo $_SERVER["PHP_SELF"]; ?>" method="post" enctype="multipart/form-data">
<input type="file" name="file" id="file" />
<input type="submit" name="submit" />
</form>
<?php
//upload
// for set memory limit & execution time
ini_set('memory_limit', '512M');
ini_set('max_execution_time', '180');
if ( isset($_POST["submit"]) ) {

   if ( isset($_FILES["file"])) {

            //if there was an error uploading the file
        if ($_FILES["file"]["error"] > 0) {
            echo "Return Code: " . $_FILES["file"]["error"] . "<br />";

        }
        else {

                 //if file already exists
             if (file_exists("upload/" . $_FILES["file"]["name"])) {
            echo $_FILES["file"]["name"] . " already exists. ";
             }
             else {
                    //Store file in directory "upload" with the name of "uploaded_file.txt"
            $storagename = "test.csv";
            move_uploaded_file($_FILES["file"]["tmp_name"], "upload/" . $storagename);
            echo "Stored in: " . "upload/" . $_FILES["file"]["name"] . "<br />";
            }
        }
     } else {
             echo "No file selected <br />";
     }
}


//display
$row = 1;
if (($handle = fopen("upload/test.csv", "r")) !== FALSE) {

    echo '<table border="1">';

    while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
        $num = count($data);
        if ($row == 1) {
            echo '<thead><tr>';
        }else{
            echo '<tr>';
        }

        for ($c=0; $c < $num; $c++) {
            //echo $data[$c] . "<br />\n";
            if(empty($data[$c])) {
               $value = "&nbsp;";
            }else{
               $value = $data[$c];
            }
            if ($row == 1) {
                echo '<th>'.$value.'</th>';
            }else{
                echo '<td>'.$value.'</td>';
            }
        }

        if ($row == 1) {
            echo '</tr></thead><tbody>';
        }else{
            echo '</tr>';
        }
        $row++;
    }

    echo '</tbody></table>';
    fclose($handle);
}
?>

1 个答案:

答案 0 :(得分:0)

当我遇到这个问题时,我使用了https://github.com/knrz/CSV.js的客户端解决方案。工作得很好,并从我的服务器负载。唯一的问题是我不需要将整个CSV上传到我的服务器,一旦解析,只有选择性部分是使用ajax发送的。

如果您只是想在HTML表格中显示数据,这可能是一个非常好的解决方案。