使用临时副本上传后将 CSV 文件解析为 JSON

Parse CSV file to JSON after uploading using temporary copy

我即将完成构建一个将 CSV 文件解析为 JSON 的功能,只是需要帮助将其拼凑起来。它的工作方式是使用 AJAX/Jquery 上传文件。一旦文件上传并发送 PHP 将 CSV 文件解析为 JSON 然后将执行。

解析后,转换后的文件将作为JSON对象推送或发送到API。这是我一直在使用的代码。对于上传,我正在使用这个插件 AJAX/JQuery File Uploader

此功能也是基于使用 RactiveJS 构建的

AJAX/Jquery 文件上传器

这是我当前上传或放置文件的部分。 URL 指向 upload.php.

<div id="fileuploader">Upload</div>

<script>
$(document).ready(function() {
    $("#fileuploader").uploadFile({
        url: 'upload.php',
    });
})
</script>

Uploads.php

有没有办法 GET 上传文件的临时副本并使用我在下面构建的 PHP 代码进行解析以将 CSV 转换为 JSON

<?php

    if ( 0 < $_FILES['file']['error'] ) {
        echo 'Error' . $_FILES['file']['error'] . '<br/>';
    }

    else {

        move_uploaded_file($_FILES['file']['tmp_name'], 'uploads/' . $_FILES['file']['name']);

    }


?>

PHP(CSV 到 JSON)

现在正在手动声明文件。

<?php
    $json_data = csvToJson('lms.csv');
?>  

<?php 


    function csvToJson($fname) {
        if (!($fp = fopen($fname, 'r') )) {
            die("Can't open file");
        }

        else {
            ('Upload File');
        }

        $key = fgetcsv($fp, "1024", ",");

        $json = array();
            while ($row = fgetcsv($fp, "1024", ",")) {
                $json[] = array_combine($key, $row);
        }

        fclose($fp);

        foreach ( $json as $k=>$v ) {

            $json[$k]['accountName']           =     $json[$k]['ACCOUNT NAME']; 
            $json[$k]['dateRequested']         =     $json[$k]['DATE']; 


            unset($json[$k]['ACCOUNT NAME']);
            unset($json[$k]['DATE']);

        }

        return json_encode($json, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES | JSON_NUMERIC_CHECK);

    }

 ?>

<?php // $target_file = fopen($_FILES["fileToUpload"]["tmp_name"], 'r'); ?>

发送 转换为 API (Ractive/AJAX/JS)

如您所见,发送部分是由点击事件触发的 (app.on)

<script src="https://cdnjs.cloudflare.com/ajax/libs/ractive/0.9.0-build-48/ractive.js"></script>



<script type="text/javascript">

var app = new Ractive({
    el       : '#container',
    template : '#template',
});


    var proxy       = 'http://192.168.1.126/lms-dev-noel/proxy.php';
    var endpoint    = 'account/leads/';
    var rt          = 'POST';
    var url         = proxy+'?endpoint='+endpoint+'&rt='+rt;

    var lms_json    = <?php echo json_encode($json_data); ?>;
    var jobjects    = JSON.parse(lms_json);


    for ( i = 0; i < jobjects.length; i++ ) {
        var data = jobjects[i];


        console.log(data);

        $.ajax({
              type     : 'POST',
              url      : url,
              data     : data,
              dataType : 'json',
              success  : function() {

              },
              error    : function(error) {
                  console.log('Error')
              }

        });

    }



</script>

警告和注意事项

好吧,这在一定程度上取决于 csvToJson 函数在代码中的位置。如果它在 uploads.php 内,或者在一个单独的文件中,您可以在 uploads.php 中 include,那么您可以这样做:

move_uploaded_file($_FILES['file']['tmp_name'], 'uploads/' . $_FILES['file']['name']);

$json_data = csvToJson('uploads/' . $_FILES['file']['name']);
echo $json_data;

然后在脚本中,更改

var lms_json    = <?php echo json_encode($json_data); ?>;

var lms_json;

并将其移至 javascript.

的顶部

您似乎在尝试在 API 调用之前分配变量。相反,您需要从 uploadFile 调用的响应中捕获数据(根据这些文档:http://hayageek.com/docs/jquery-upload-file.php):

$("#fileuploader").uploadFile({
    url: 'upload.php',
    onSuccess:function(files,data,xhr,pd)
    {
      //data: response from server
      lms_json = data;
    }
});